概述
一、文件/目录查询结果显示
ls 显示文件/目录基本列表
**常用的选项有: **
$ ls -F
#轻松区分文件和目录,目录的最后有"/"
$ ls -a
#显示隐藏文件
$ ls -R
#递归方式显示目录内的所有文件/目录
$ ls -l
#显示每个文件的相关信息,如文件类型、权限、硬链接总数、属主、属组、修改时间等
$ ls -i
#显示文件的inode编号
常见的文件类型包括普通文件(-)、目录文件(d)、链接文件(l)、管道文件(p)、块设备文件(b)以及字符设备文件(c)。
file 查看文件类型
file命令可以查看文件是什么类型,如目录,二进制文件,链接文件,脚本文件,可执行文件等。
$ file a
#a为目录
a: directory
$ file test_three
#test_three为空文件
test_three: empty
$ echo aa > test_three
#将aa字符串写入test_three文件
$ file test_three
#test_three为二进制文件
test_three: ASCII text
$ file a.sh
#a.sh为脚本文件
a.sh: Bourne-Again shell script, ASCII text executable
$ file /bin/rar
#/bar/rar为二进制可执行文件
/bin/rar: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.15, BuildID[sha1]=aa2e0c518e5d0025864a8afdd6101d04c86ad3ef, stripped
cat 显示文本文件的内容
$ cat test_three
#查看test_three文件的内容
a
d
d
$ cat -n test_three
#查看test_three文件的内容,并显示行号
1
a
2
3
d
d
$ cat -b test_three
#查看test_three文件的内容,并给有文本的行显示行号
1
a
2
d
d
$ cat -T test_three
#查看test_three文件的内容,将制表符用^I字符替换
a
d^Id
more 分页显示文本文件的内容
cat命令是一次性显示文本文件的全部内容,因此,对于长文本文件来说,只能看到屏幕上最后面的内容。而more命令则可以分屏显示,也就是每次显示一屏的文字。
$ cat /etc/bash.bashrc
$ more /etc/bash.bashrc
less 更加自主控制所显示的文本文件的内容
less提供一些移动文字的快捷键,如b/u可以往前翻,d/y可以往后翻,q表示退出显示,等等。
$ less /etc/bash.bashrc
tail 显示文件末尾内容,默认10行
$ tail /etc/bash.bashrc
return $?
elif [ -x /usr/share/command-not-found/command-not-found ]; then
/usr/share/command-not-found/command-not-found -- "$1"
return $?
else
printf "%s: command not found
" "$1" >&2
return 127
fi
}
fi
$ tail -n 5 /etc/bash.bashrc
#-n 5可以用-5替代
printf "%s: command not found
" "$1" >&2
return 127
fi
}
fi
head 显示文件开头部分内容,默认10行
$ head /etc/bash.bashrc
# System-wide .bashrc file for interactive bash(1) shells.
# To enable the settings / commands in this file for login shells as well,
# this file has to be sourced in /etc/profile.
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
$ head -5 /etc/bash.bashrc
# System-wide .bashrc file for interactive bash(1) shells.
# To enable the settings / commands in this file for login shells as well,
# this file has to be sourced in /etc/profile.
grep 从文件中按“行”提取符合匹配模式的文本内容
语法: grep [选项] 模式 文本对象
选项
-i, --ignore-case
忽略<模式>大小写
-w, --word-regexp
强制<模式>仅完全匹配字词
-x, --line-regexp
强制<模式>仅完全匹配整行
-z, --null-data
数据行以一个 0 字节结束,而非换行符
-s, --no-messages
不显示错误信息
-v, --invert-match
反向选择,即选中不匹配的行
-V, --version
显示版本信息并退出
-n, --line-number
输出的同时打印行号
-c, --count
只打印每个<文件>中的匹配<模式>的行数目
$ sudo cat /etc/sudoers | grep -v '#' | grep -v '^$'
#显示/etc/sudoers文件中不包含'#'的行和空行
cut 对格式化的文本进行指定内容输出
对于某些有分割符的文件,可以通过分隔符来显示指定位置的文本。如果没有指定文件,或者文件为"-",则从标准输入读取输入字符。
常用选项
-d, --delimiter=分界符
使用指定分界符代替制表符作为区域分界
-b, --bytes=列表
只选中指定的这些字节
-c, --characters=列表
只选中指定的这些字符
-f, --fields=LIST
只选中指定的这些域;还打印不包含分隔符的任何行,除非指定了-s选项
-s, --only-delimited
不打印没有包含分界符的行
**-b, -c 或-f 参数格式表示范围如下: **
-
N 从第1个开始数的第N个字节、字符或域
-
N- 从第N个开始到所在行结束的所有字符、字节或域
-
N-M 从第N个开始到第M个之间(包括第M个)的所有字符、字节或域
-
-M 从第1个开始到第M个之间(包括第M个)的所有字符、字节或域
$ cut -d : -f 1,2,4 /etc/passwd
root❌0
daemon❌1
bin❌2
…省略…
wc 统计文本文件的行数、字数、字节数
$ wc /etc/bash.bashrc
71
329 2319 /etc/bash.bashrc
stat 查看文件的存储细节和时间参数
$ stat /etc/bash.bashrc
文件: /etc/bash.bashrc
大小: 2319
块: 8
IO 块: 4096
普通文件
设备: 804h/2052d
Inode: 5243317
硬链接: 1
权限: (0644/-rw-r--r--)
Uid: (
0/
root)
Gid: (
0/
root)
最近访问: 2022-03-18 09:11:50.556627063 +0800
最近更改: 2020-02-25 20:03:22.000000000 +0800
最近改动: 2021-12-31 16:25:12.904966474 +0800
创建时间: -
sort 对文本内容进行排序后显示(不改变原文本内容)
语法: sort [选项] 文件名
选项
-b, --ignore-leading-blanks
忽略前导的空白区域
-d, --dictionary-order
只考虑空白区域和字母字符
-f, --ignore-case
忽略字母大小写
-g, --general-numeric-sort
按一般数字排序
-h, --human-numeric-sort
使用易读性数字(例如:
2K 1G)
-M, --month-sort
按月份排序 (unknown) < 'JAN' < ... < 'DEC'
-n, --numeric-sort
按数字排序
-R, --random-sort
随机排序
-V, --version-sort
在文本内进行自然版本排序
-r, --reverse
反向排序
--sort=WORD
按照WORD 指定的格式排序: 一般数字-g,高可读性-h,月份-M,数字-n,随机-R,版本-V
-u, --unique
配合-c,严格校验排序;不配合-c,则只输出一次排序结果
-c, --check, --check=diagnose-first
检查输入是否已排序,若已有序则不进行操作
-t, --field-separator=分隔符
使用指定的分隔符代替非空格到空格的转换
-V, --version-sort
在文本内进行自然版本排序
uniq 去重显示文件内容
uniq,unique的缩写,可以去除文本中连续的重复行并输出(不改变原文本内容),但不连续的重复行将不予处理
diff 比较文件之间内容的差异
二、文件/目录管理
touch 创建空文件
touch filename #不存在即创建空文件,存在即改变文件的修改时间
$ pwd
#查看当前目录
/home/hollowman/shellstudy
$ touch test_one
#创建空文件
$ stat test_one
#查看文件时间信息
文件: test_one
大小: 0
块: 0
IO 块: 4096
普通空文件
设备: 804h/2052d Inode: 4468041
硬链接: 1
权限: (0664/-rw-rw-r--)
Uid: ( 1000/hollowman)
Gid: ( 1000/hollowman)
最近访问: 2022-03-17 14:04:23.133578989 +0800
最近更改: 2022-03-17 14:04:23.133578989 +0800
最近改动: 2022-03-17 14:04:23.133578989 +0800
创建时间: -
$ touch test_one #改变文件的修改时间
$ stat test_one
文件: test_one
大小: 0
块: 0
IO 块: 4096
普通空文件
设备: 804h/2052d Inode: 4468041
硬链接: 1
权限: (0664/-rw-rw-r--)
Uid: ( 1000/hollowman)
Gid: ( 1000/hollowman)
最近访问: 2022-03-17 14:05:49.624544261 +0800
最近更改: 2022-03-17 14:05:49.624544261 +0800
最近改动: 2022-03-17 14:05:49.624544261 +0800
创建时间: -
touch -a filename #只修改文件的访问时间
$ touch -a test_one
$ stat test_one
文件: test_one
大小: 0
块: 0
IO 块: 4096
普通空文件
设备: 804h/2052d Inode: 4468041
硬链接: 1
权限: (0664/-rw-rw-r--)
Uid: ( 1000/hollowman)
Gid: ( 1000/hollowman)
最近访问: 2022-03-17 14:10:04.416773006 +0800
最近更改: 2022-03-17 14:05:49.624544261 +0800
最近改动: 2022-03-17 14:10:04.416773006 +0800
创建时间: -
cp 复制文件
cp [选项] source destination
$ cp test_one test_two
#简单复制命令,但目标文件有新的修改时间
$ ls -l
总用量 0
-rw-rw-r-- 1 hollowman hollowman 0 3月
17 14:05 test_one
-rw-rw-r-- 1 hollowman hollowman 0 3月
17 14:15 test_two
如果目标文件已经存在,cp命令并不会提醒,加上-i选项后,则会强制询问是否需要覆盖已有文件。
$ cp -i test_one test_two
cp: 是否覆盖'test_two'? n
如果需要将非当前工作目录的文件复制到当前目录,可使用" . "
$ touch ../test_three
#尝试在当前目录的父目录创建一个文件
$ cp ../test_three .
#将父目录的文件复制到当前目录
$ ls -l
总用量 0
-rw-rw-r-- 1 hollowman hollowman 0 3月
17 14:05 test_one
-rw-rw-r-- 1 hollowman hollowman 0 3月
17 14:22 test_three
-rw-rw-r-- 1 hollowman hollowman 0 3月
17 14:15 test_two
注意复制文件到某个目录时,不要忘记"/",除非您能确保该目录存在。
$ cp test_one ../testdirs/
#因为testdirs不存在,所以会提示无法创建普通文件。
cp: 无法创建普通文件'../testdirs/': 不是目录
$ cp test_one ../testdirs #本意是复制到testdirs目录,而实际则是将复制后的文件重命名为testdirs。
复制目录及目录下面的所有文件,可以用-R属性
$ cp -R ../testdir/ .
$ ls -F
testdir/
test_one
test_three
test_two
ln 创建链接文件
链接文件有两种类型,符号链接 和 硬链接
符号链接 就是一个实实在在的文件,它指向存放在虚拟目录结构中某个地方的另一个文件。这两个通过符号链接在一起的文件,彼此的内容并不相同。使用
-s
选项可创建符号链接
硬链接 会创建独立的虚拟文件,其中包含了原始文件的信息及位置。但是它们从根本上而言是同一个文件。引用硬链接文件等同于引用了源文件。要创建硬链接,原始文件也必须事先存在,只不过这次使用ln命令时不再需要加入额外的参数了。
$ ln -s test_one ln_test_one_s
#创建符号链接
$ ln test_one ln_test_one
#创建硬链接
$ ls -il *one*
#查看文件列表,对比3个文件
4468041 -rw-rw-r-- 2 hollowman hollowman 0 3月
17 14:05 ln_test_one
4457640 lrwxrwxrwx 1 hollowman hollowman 8 3月
18 09:26 ln_test_one_s -> test_one
4468041 -rw-rw-r-- 2 hollowman hollowman 0 3月
17 14:05 test_one
可以看出,符号链接文件属性与源文件属性并不相同,大小不同,inode编号也不同,类似于快捷方式,而硬链接文件和原始文件属性相同,并且同inode编号,属性中的2是硬链接数,表示该文件有2个硬链接文件,修改任意一个硬链接文件其他文件都会改变,删除1个硬链接对应的硬链接数将减1
注意: 只能对处于同一存储媒体的文件创建硬链接。要想在不同存储媒体的文件之间创建链接,只能使用符号链接。
mv 重命名/移动文件
mv命令可以将文件或目录移动到另一个位置或重新命名,而且,并不会改变文件的inode编号和时间戳。
当目标文件已存在时,会进行覆盖操作,通过-i选项可以在试图覆盖已有文件是得到提示
$ mv -i test_two test_three
mv: 是否覆盖'test_three'? n
$ mv test_two test_three
rm 删除文件
**常用选项: **
rm -i filename
#删除前确认,养成使用-i的好习惯
rm -f filename
#强制删除,慎用
rm -r dirname
#删除目录及目录内的文件
rm -rf /
#强制删除根目录及目录文件,除非搞破坏不要使用此命令。
$ ls -F
ln_test_one_ss
testdir/
test_three
$ rm -i ln_test_one_ss
#确认后再删除文件
rm: 是否删除普通空文件 'ln_test_one_ss'? y
$ rm -r testdir/
#删除目录
$ ls -F
ln_test_one_ss
test_three
mkdir 创建目录
-p选项可以同事创建多层目录
$ mkdir a/b/c
mkdir: 无法创建目录 “a/b/c”: 没有那个文件或目录
$ mkdir -p a/b/c
$ cd a/b/c
/a/b/c$
rmdir 删除目录
rmdir命令只能删除空目录,
rm -i
也可以用来删除目录,并且是非空目录,因此一般不用rmdir命令。
tr 替换文本内容
tr,translate的意思,可以替换文本内容中的字符,需通过管道符来实现
语法: tr [原始字符] [目标字符]
tar 对文件进行压缩、解压缩
语法: tar [选项...] [FILE]...
选项
-c
创建压缩文件
-x
解开压缩文件
-t
查看压缩包内有哪些文件
-z
用Gzip压缩或解压
-j
用bzip2压缩或解压
-v
显示压缩或解压的过程
-f
目标文件名
-p
保留原始的权限与属性
-P
使用绝对路径来压缩
-C
指定解压到的目录
实例
tar -cvf archive.tar foo bar
# 将foo和bar压缩为archive.tar包
tar -xvf archive.tar
# 将archive.tar解压缩
tar -tvf archive.tar
# 查看archive.tar包文件列表
dd 复制文件,依照指定操作数转换并格式化。
语法: dd [操作数] ...
或: dd 选项
(仅用于显示帮助信息–help和版本信息–version)
常用操作数
if=文件
从指定文件而非标准输入来进行读取
of=文件
写入到指定文件而非标准输出
bs=字节数
一次读写的比特数(默认: 512);会覆盖 ibs 和 obs 选项
ibs=字节数
一次读取的字节数(默认: 512),与obs配合使用
obs=字节数
一次写入指定字节数(默认: 512),与ibs配合使用
cbs=字节数
一次转换的字节数
count=块数
指定需要复制的输入块的数量
**块数和字节数后可以带有以下的一个或多个后缀: **
c=1, w=2, b=512, kB=1000, K=1024, MB=1000_1000, M=1024_1024, xM=M,GB=1000_1000_1000, G=1024_1024_1024 以及相应可使用 T, P, E, Z, Y。也可使用二进制进位前缀: 如 KiB=K、MiB=M 等等。
以下3个复制操作数虽不同,但效果相同:
# dd if=/dev/zero of=h1 count=1 bs=1024
记录了1+0 的读入
记录了1+0 的写出
1024字节(1.0 kB,1.0 KiB)已复制,0.000397286 s,2.6 MB/s
# dd if=/dev/zero of=h1 count=1 obs=1024 ibs=1024
记录了1+0 的读入
记录了1+0 的写出
1024字节(1.0 kB,1.0 KiB)已复制,0.00090209 s,1.1 MB/s
# dd if=/dev/zero of=h1 count=2
记录了2+0 的读入
记录了2+0 的写出
1024字节(1.0 kB,1.0 KiB)已复制,0.000301429 s,3.4 MB/s
/dev/zero:“零”设备,本身不占存储空间,但可以无限的提供空字符(0x00,ASCII代码NUL)。常用来配合dd命令生成一个特定大小的文件。
三、文件权限管理
chown 修改文件的属主(所有者)和属组(所属组)
语法: chown owner:group 文件名
$ ls -l
总用量 12
drwxrwxr-x 3 hollowman hollowman 4096 3月
18 11:07 a
-rw-rw-r-- 1 hollowman hollowman
22 3月
18 13:22 a.sh
-rw-rw-r-- 1 hollowman hollowman
7 3月
18 13:33 test_three
$ sudo chown root:root a.sh
#注意: 如果涉及到root用户,需要通过sudo获取root权限
[sudo] hollowman 的密码:
$ ls -l
总用量 12
drwxrwxr-x 3 hollowman hollowman 4096 3月
18 11:07 a
-rw-rw-r-- 1 root
root
22 3月
18 13:22 a.sh
-rw-rw-r-- 1 hollowman hollowman
7 3月
18 13:33 test_three
chmod 修改文件/目录权限
$ ll file1
#无权限文件file1
---------- 1 hollowman hollowman 0 9月
18 11:18 file1
$ chmod u+r,g+w file1 #u,g分别赋权r和w
$ ll file1
-r---w---- 1 hollowman hollowman 0 9月
18 11:18 file1
$ chmod +x file1
#u,g,o都赋权x
$ ll file1
-r-x-wx--x 1 hollowman hollowman 0 9月
18 11:18 file1*
$ chmod ugo+rwx file1
#u,g,o都赋权rwx
$ ll file1
-rwxrwxrwx 1 hollowman hollowman 0 9月
18 11:18 file1*
$ chmod 765 file1
#数字赋权法
$ ll file1
-rwxrw-r-x 1 hollowman hollowman 0 9月
18 11:18 file1*
SUID,SGID,SBIT赋权
SUID: 让二进制程序的执行者临时拥有所有者的权限(仅对拥有执行权限的二进制程序有效)。
SGID: 当对二进制程序进行设置时,能够让执行者临时获取文件所属组的权限;当对目录进行设置时,则是让目录内新创建的文件自动继承该目录原有用户组的名称。
SBIT(Sticky Bit)粘滞位: 当对目录设置SBIT权限后,目录中的文件只能被文件所有者删除,也就是用户只能删除自己的文件,而不能删除其他用户的文件。
$ chmod ug+s,o+t file1
$ ll file1
-rwsrwsrwt 1 hollowman hollowman 0 9月
18 11:18 file1*
$ chmod 4000 file1
$ ll file1
---S------ 1 hollowman hollowman 0 9月
18 11:18 file1
$ chmod 6000 file1
$ ll file1
---S--S--- 1 hollowman hollowman 0 9月
18 11:18 file1
$ chmod 7000 file1
$ ll file1
---S--S--T 1 hollowman hollowman 0 9月
18 11:18 file1
$ chmod 7777 file1
$ ll file1
-rwsrwsrwt 1 hollowman hollowman 0 9月
18 11:18 file1*
chattr 设置文件隐藏权限(change attributes)
语法: chattr [-pRVf] [-+=aAcCdDeijPsStTuF] [-v version] files...
**属性: **
s:
第1位隐藏属性,彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域)
u:
第2位隐藏属性,与s相反,当设定为u时,数据内容其实还存在磁盘中,可以用于undeletion
S:
第3位隐藏属性,文件内容在变更后立即同步到硬盘(sync)
i:
第5位隐藏属性,设定文件不能被修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件。
a:
第6位隐藏属性,append Only,仅允许补充(追加)内容,无法覆盖/删除内容。
d:
第7位隐藏属性,no dump,使用dump命令备份时忽略(也就是不备份)本文件/目录
A:
第8位隐藏属性,文件或目录的 atime (access time)不可被修改(modified)
c:
第9位隐藏属性,compresse,设定文件是否经压缩后再存储。读取时需要经过自动解压操作。
j:
第11位隐藏属性,journal,设定此参数使得当通过mount参数: data=ordered 或者 data=writeback 挂载的文件系统,文件在写入时会先被记录(在journal中)。如果filesystem被设定参数为 data=journal,则该参数自动失效。
t:
第12位隐藏属性,让文件系统支持尾部合并(tail-merging)
D:
检查压缩文件中的错误(不能通过lsattr查看,直接通过+D进行检查)
lsattr 查看文件隐藏属性
# chattr +s test_three
&& lsattr ./test_three
s------------------- ./test_three
# chattr -s test_three
&& lsattr ./test_three
-------------------- ./test_three
# chattr =uiaAct test_three
&& lsattr ./test_three
-u--ia-Ac---t------- ./test_three
# chattr -uiaAct test_three
&& lsattr ./test_three
-------------------- ./test_three
setfacl 设置文件的ACL(访问控制列表)
语法: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
选项:
-m, --modify=acl 更改文件的访问控制列表
-M, --modify-file=file 从文件读取访问控制列表条目更改
-x, --remove=acl 根据文件中访问控制列表移除条目
-X, --remove-file=file 从文件读取访问控制列表条目并删除
-b, --remove-all 删除所有扩展访问控制列表条目
-k, --remove-default 移除默认访问控制列表
--set=acl 设定替换当前的文件访问控制列表
--set-file=file 从文件中读取访问控制列表条目设定
--mask 重新计算有效权限掩码
-n, --no-mask 不重新计算有效权限掩码
-d, --default 应用到默认访问控制列表的操作
-R, --recursive 递归操作子目录
-L, --logical 依照系统逻辑,跟随符号链接
-P, --physical 依照自然逻辑,不跟随符号链接
--restore=file 恢复访问控制列表,和“getfacl -R”作用相反
--test 测试模式,并不真正修改访问控制列表属性
-v, --version
显示版本并退出
-h, --help
显示本帮助信息
getfacl 查看文件的ACL(访问控制列表)
语法: getfacl [-aceEsRLPtpndvh] 文件 ...
选项:
-a,
--access
仅显示文件访问控制列表
-d, --default
仅显示默认的访问控制列表
-c, --omit-header
不显示注释表头
-e, --all-effective
显示所有的有效权限
-E, --no-effective
显示无效权限
-s, --skip-base
跳过只有基条目(base entries)的文件
-R, --recursive
递归显示子目录
-L, --logical
逻辑遍历(跟随符号链接)
-P, --physical
物理遍历(不跟随符号链接)
-t, --tabular
使用制表符分隔的输出格式
-n, --numeric
显示数字的用户/组标识
-p, --absolute-names
不去除路径前的 '/' 符号
-v, --version
显示版本并退出
-h, --help
显示本帮助信息
最后
以上就是默默蜻蜓为你收集整理的linux命令-文件目录管理的全部内容,希望文章能够帮你解决linux命令-文件目录管理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复