博客大纲
本系列博客依据man手册来讲解指令及其选项,并带有大量示例。
需要选项查阅时,直接依据索引跳转即可。
目录展示
本博客示例所处的目录结构:
. ├── 123.txt ├── 124.txt ├── a │ └── b │ └── c │ └── d │ └── e │ └── f ├── abc │ ├── 1.txt │ ├── 2.txt │ ├── 3.txt │ ├── 4.txt │ └── 5.txt ├── a.out └── code.c
ls指令
前提知识需要
在阅读本博客时,可能需要用到的知识:
指令释义
全称:
list directory contents
单词 | 释义 |
list: | 列出 |
directory: | 目录,文件夹 |
contents: | 内容 |
功能:
当使用ls指令作用于文件时,将会列出该文件的信息;当使用ls指令作用于目录时,则会列出该目录下的文件与子目录;
基本语法
语法:
ls [选项] [文件名…]
使用示例:
不操作文件名:
当我们直接使用ls,而不加任何选项与文件名,就会输出当前目录下的所有子目录与文件夹:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls 123.txt 124.txt a abc a.out code.c
操作目录名:
在我们当前目录下,我们有一个abc的子目录。当我们对abc使用ls指令,最后就会输出abc目录中的所有内容:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls abc 1.txt 2.txt 3.txt 4.txt 5.txt
操作文件:
而当我们对当前目录下的123.txt使用ls指令,在不加选项的情况下,只输出文件名:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls 123.txt 123.txt
选项
-1选项
功能:一行输出一个文件(单列输出)。
使用示例:
- 对照组:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls 123.txt 124.txt a abc a.out code.c
- 对当前目录使用
-1
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -1 123.txt 124.txt a abc a.out code.c
可以发现:每个文件或目录都独占一列了。
-a选项 --all
功能:列出目录中所有文件,包括以“.”开头的文件。
使用示例:
- 对照组:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls 123.txt 124.txt a abc a.out code.c
- 对当前目录使用
-a
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -a . .. 123.txt 124.txt a abc a.out code.c .hide
可以发现:我们使用-a
选项后,多出来了三个文件,它们都是以’"."开头的隐藏文件。所以-a
可以显示一些无法直接观察到的隐藏文件。
-A选项
功能:列出目录中除了".'与"…"外的所有文件。
使用示例:
- 对照组:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls 123.txt 124.txt a abc a.out code.c
- 对当前目录使用
-a
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -a . .. 123.txt 124.txt a abc a.out code.c .hide
- 对当前目录使用
-A
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -A 123.txt 124.txt a abc a.out code.c .hide
可以发现:当使用-A
选项后,相比于使用-a
选项,少了".'与"…“两个文件,但是相比于对照组,任然多了”.hide"文件。也就是说,-A
选项一般用于输出".'与"…"以外的隐藏文件。
-c选项 --time=ctime, --time=status
功能: 按文件状态改变时间(i节点中的ctime)排序并输出目录内容。
使用示例:
- 对照组:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls 123.txt 124.txt a abc a.out code.c
- 对当前目录使用
-c
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -c abc 123.txt a.out code.c 124.txt a
可以发现:使用-c
选项后,文件的排列顺序改变了。
-c
选项可以让文件按照最后状态改变的时间排序。
证明:
我们先在当前目录创建一个名为b的目录,在分别用指令操作:
- 不对当前目录使用
-c
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls 123.txt 124.txt a abc a.out b code.c
- 对当前目录使用
-c
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -c b abc 123.txt a.out code.c 124.txt a
可以发现:没有-c
选项的时候,新创建的目录插在了a开头的文件与c开头的文件中间,也就是按照字母表排的序。
而当使用-c
选项后,新创建的目录放在了最开头的位置,因为b目录是最后创建的,也就是最后状态发生改变的。
###-t选项 --sort=time
功能:按文件最近修改时间( i 节点中的 mtime )而不是按文件名字典序排序,新文件靠前。
使用示例:
- 对照组:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls 123.txt 124.txt a abc a.out code.c
- 对当前目录使用
-t
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -t abc 123.txt a.out code.c 124.txt a
可以发现:当我们使用-t
选项后,文件的顺序发生了改变,这就是根据文件的最近修改时间排的序。
-d选项 --directory
功能:将目录名像其它文件一样列出,而不是列出它们的内容。
使用此功能,其实就是把目录当成文件来输出。
使用示例:
- 对照组:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls abc 1.txt 2.txt 3.txt 4.txt 5.txt
- 对abc目录使用
-c
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -d abc abc
当我们使用ls对一个目录操作的时候,会输出目录的所有内容,而当我们对文件使用ls时,就只会输出文件名。
此处我们直接对abc目录使用ls后,输出了abc目录中的文件;当加上-d
选项后,abc目录就被当成了一个文件,只输出名称了。
-f选项
功能:不排序目录内容;按它们在磁盘上存储的顺序列出,同时启动“ -a ”选项。
这也是一个调序的选项,它会按照文件与目录在磁盘中存储的顺序输出。启动-a
选项的意思是,只使用-f
也会带着隐藏文件一起输出。
使用示例:
- 对照组:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls 123.txt 124.txt a abc a.out code.c
- 对当前目录使用
-f
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -f abc .. a.out 123.txt 124.txt . a .hide code.c
可以发现:使用-f
选项后,这个输出顺序就改变了,还会顺带输出隐藏文件。
-U选项 --sort=none
功能:不排序目录内容;按它们在磁盘上存储的顺序列出。
使用示例:
- 对照组:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls 123.txt 124.txt a abc a.out code.c
- 对当前目录使用
-f
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -f abc .. a.out 123.txt 124.txt . a .hide code.c
- 对当前目录使用
-U
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -U abc a.out 123.txt 124.txt a code.c
相比于-f
选项,-U
不会开启或禁止其它选项,比如此处-f
就会顺带开启“ -a ”,选项显示隐藏文件,而-U
没有。
-i选项 --inode
功能:在每个文件左边打印i节点号。
使用示例:
- 对照组:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls 123.txt 124.txt a abc a.out code.c
- 对当前目录使用
-i
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -i 1315676 123.txt 1315677 124.txt 1314444 a 1315680 abc 1315679 a.out 1315678 code.c
可以发现:当我们使用-i
选项后,每个文件或目录的左侧都出现了相应的节点号。
-l选项 --format=long, --format=verbose
功能:除每个文件名外,增加显示文件类型、权限、硬链接数、所有者名、组名、大小( byte )、及时间信息(如未指明是其它时间即指修改时间)。
可以简单将其理解为,更详细地显示出文件与目录的信息。
使用示例:
- 对照组:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls 123.txt 124.txt a abc a.out code.c
- 对当前目录使用
-l
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -l total 32 -rw-r--r-- 1 root root 59 Nov 25 16:54 123.txt -rw-r--r-- 1 root root 0 Nov 25 16:52 124.txt drwxr-xr-x 3 root root 4096 Nov 25 16:48 a drwxr-xr-x 2 root root 4096 Nov 25 16:56 abc -rwxr-xr-x 1 root root 8360 Nov 25 16:53 a.out -rw-r--r-- 1 root root 70 Nov 25 16:53 code.c
可以发现:当我们使用-l
选项后,每个文件或目录都有了十分详细的信息。
组合:
我们再尝试去单独观察一个目录的详细信息:
- 对abc目录使用
-l
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -l abc total 0 -rw-r--r-- 1 root root 0 Nov 25 16:56 1.txt -rw-r--r-- 1 root root 0 Nov 25 16:56 2.txt -rw-r--r-- 1 root root 0 Nov 25 16:56 3.txt -rw-r--r-- 1 root root 0 Nov 25 16:56 4.txt -rw-r--r-- 1 root root 0 Nov 25 16:56 5.txt
此时操作系统并没有输出abc目录本身的详细信息,而是将abc目录下的文件的详细信息输出了。这是一位ls操作在目录时,就是会输出这个目录的内容。在此我们要额外使用-d
选项,将这个abc目录当作文件处理:
- 对abc目录使用
-l
和-d
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -l -d abc drwxr-xr-x 2 root root 4096 Nov 25 16:56 abc
这样我们就可以得到abc目录本身的信息了。
缩写形式:
我们在使用ls -l
的时候,可以将其简写为ll
。两者的效果是一致的:
- 对当前目录使用
ll
:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ll total 32 -rw-r--r-- 1 root root 59 Nov 25 16:54 123.txt -rw-r--r-- 1 root root 0 Nov 25 16:52 124.txt drwxr-xr-x 3 root root 4096 Nov 25 16:48 a drwxr-xr-x 2 root root 4096 Nov 25 16:56 abc -rwxr-xr-x 1 root root 8360 Nov 25 16:53 a.out -rw-r--r-- 1 root root 70 Nov 25 16:53 code.c
-m选项 --format=commas
功能: 水平列出文件,每行尽可能多,相互用逗号和一个空格分隔。
使用示例:
- 对照组:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls 123.txt 124.txt a abc a.out code.c
- 对当前目录使用
-m
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -m 123.txt, 124.txt, a, abc, a.out, code.c
可以发现:当我们使用-m
选项后,每个文件或目录都被一个空格和逗号分割开了。
那要怎样理解每行尽量多这个句子呢?
我们尝试压缩我们的终端(即显示器)的大小,再输出一遍:
- 对比项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInst | <-这是屏幕边界 ruction]# ls | 123.txt a a.out code.c | 124.txt abc
当我们压缩后,直接使用ls,超出屏幕边界的文件名会自动换行到下一行。
- 对当前目录使用
-m
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInst | <-这是屏幕边界 ruction]# ls -m | 123.txt, 124.txt, a, abc, a.out, | code.c
当我们压缩后,使用-m
选项,发现,文件的顺序被调整了,这是因为它会尽量保证在每行尽量多输出文件。所以对文件进行了一次排序,以保证排序后,可以让一行内出现的文件数最多。比如此处使用-m
选项后就比使用前的第一行多放了两个文件。
-n选项 --numeric-uid-gid
功能:列出数字化的 UID 和 GID 而不是用户名和组名。
使用示例:
- 对照组:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -l total 32 -rw-r--r-- 1 root root 59 Nov 25 16:54 123.txt -rw-r--r-- 1 root root 0 Nov 25 16:52 124.txt drwxr-xr-x 3 root root 4096 Nov 25 16:48 a drwxr-xr-x 2 root root 4096 Nov 25 16:56 abc -rwxr-xr-x 1 root root 8360 Nov 25 16:53 a.out -rw-r--r-- 1 root root 70 Nov 25 16:53 code.c
- 对当前目录使用
-n
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -n total 32 -rw-r--r-- 1 0 0 59 Nov 25 16:54 123.txt -rw-r--r-- 1 0 0 0 Nov 25 16:52 124.txt drwxr-xr-x 3 0 0 4096 Nov 25 16:48 a drwxr-xr-x 2 0 0 4096 Nov 25 16:56 abc -rwxr-xr-x 1 0 0 8360 Nov 25 16:53 a.out -rw-r--r-- 1 0 0 70 Nov 25 16:53 code.c
可以发现:当我们使用-n
选项后,相比于-l
选项,root被改为了0,也就是数字化的UID与GID。
-o选项
功能:以长格式列出目录内容,但是不显示组信息。
使用示例:
- 对照组:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -l total 32 -rw-r--r-- 1 root root 59 Nov 25 16:54 123.txt -rw-r--r-- 1 root root 0 Nov 25 16:52 124.txt drwxr-xr-x 3 root root 4096 Nov 25 16:48 a drwxr-xr-x 2 root root 4096 Nov 25 16:56 abc -rwxr-xr-x 1 root root 8360 Nov 25 16:53 a.out -rw-r--r-- 1 root root 70 Nov 25 16:53 code.c
- 对当前目录使用
-o
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -o total 32 -rw-r--r-- 1 root 59 Nov 25 16:54 123.txt -rw-r--r-- 1 root 0 Nov 25 16:52 124.txt drwxr-xr-x 3 root 4096 Nov 25 16:48 a drwxr-xr-x 2 root 4096 Nov 25 16:56 abc -rwxr-xr-x 1 root 8360 Nov 25 16:53 a.out -rw-r--r-- 1 root 70 Nov 25 16:53 code.c
可以发现:当使用-o
选项后,相比于-l
选项,少了一组root,即少输出了一个组信息。
提供此选项是为了与其它版本的ls 兼容。
-G选项 --no-group
功能:以长格式列目录时不显示组信息。
使用示例:
- 对照组:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls 123.txt 124.txt a abc a.out code.c
- 对当前目录使用
-G
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -G 123.txt 124.txt a abc a.out code.c
- 对当前目录使用
-G
与-l
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ll -G total 28 -rw-r--r-- 1 root 59 Nov 25 16:54 123.txt -rw-r--r-- 1 root 0 Nov 25 16:52 124.txt drwxr-xr-x 3 root 4096 Nov 25 16:48 a drwxr-xr-x 2 root 4096 Nov 25 16:56 abc -rwxr-xr-x 1 root 8360 Nov 25 16:53 a.out -rw-r--r-- 1 root 70 Nov 25 16:53 code.c
可以发现:当使用-G
选项后,并不能像-o
一般输出所有文件的详细信息,只能配合着-l
选项一起使用,并减去原本应该输出的组名。
-F选项 --classify, --file-type
功能:在每个文件名后附上一个字符以说明该文件的类型。
类型说明:
符号 | 类型 |
“ * ” | 表示普通的可执行文件; |
“ / ” | 表示目录; |
“ @ ” | 表示符号链接; |
“| ” | 表示FIFOs; |
“ = ” | 表示套接字 (sockets) ; |
什么也没有 | 表示普通文件。 |
使用示例:
- 对比项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls 123.txt 124.txt a abc a.out code.c
- 对当前目录使用
-F
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -F 123.txt 124.txt a/ abc/ a.out* code.c
可以发现:当我们使用-F
选项后,在输出文件名称的末尾,标识了每种文件的类型。
此处注意”.txt“不是上述类型之一,它被解析为普通文件,故什么也没有加,".txt"只是文件名的一部分。
-p选项
功能:在每个文件名后附上一个字符以说明该文件的类型。类似“ -F ”选项但是不 标示可执行文件。
使用示例:
- 对照组:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -F 123.txt 124.txt a/ abc/ a.out* b/ code.c
- 对当前目录使用
-p
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -p 123.txt 124.txt a/ abc/ a.out code.c
可以发现:当我们使用-p
选项后,相比于使用-F
选项后,并没有将a.out这个可执行文件标识出来。
-r选项 --reverse
功能:逆序排列目录内容。
使用示例:
- 对比项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls 123.txt 124.txt a abc a.out code.c
- 对当前目录使用
-r
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -r code.c a.out abc a 124.txt 123.txt
可以发现:当我们使用-r
选项后,刚好将文件与目录的顺序倒置了一遍
-s选项 --size
功能:在每个文件名左侧输出该文件的大小,以1024字节(即1k)的块为单位。
使用示例:
-对照组:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls 123.txt 124.txt a abc a.out code.c
- 对当前目录使用
-s
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -s total 32 4 123.txt 0 124.txt 4 a 4 abc 12 a.out 4 code.c
可以发现:当我们使用-s
选项后,每个文件前都多出了一组数字,这个数字的单位为K。
-w选项 -width cols
功能:假定屏幕宽度为指定值。
此选项使用时要在后面加上数字,数字值代表当前屏幕宽度。
使用示例:
- 对照组:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls | <-这是屏幕的边界 123.txt 124.txt a abc a.out code.c
- 对当前目录使用
-w
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -w 20 | <-这是屏幕的边界 123.txt abc | 124.txt a.out | a code.c
可以发现:当我们使用-w
选项,并将宽度设为20后,虽然真实的屏幕边界没有动,但是其依然限制了输出的宽度为指定值。
-x选项 --format=across, --format=horizontal
功能:多列输出时,横向排序。
使用示例:
- 对照组:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls 123.txt 124.txt a abc a.out code.c
- 对当前目录使用
-w
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -w 20 123.txt abc 124.txt a.out a code.c
- 对当前目录使用
-w
和-x
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -w 20 -x 123.txt 124.txt a abc a.out code.c
我们现在对比三个输出结果
当我们只用-w
时,其文件的排列顺序是纵向排列的,也就是按照对照组的顺序,先将第一条纵队排满,再去排第二条纵队。
当我们再加上-x
选项时,其文件的排列顺序就变成了横向的,也就是按照对照组的顺序,会先将第一排排满,再去排第二排。
所以-x
选项的作用是在多列输出的时候,将文件横向排序。
此外,此处额外插入一个选项:
-C选项 --format=vertical
功能: 多列输出,纵向排序。当标准输出是终端时这是缺省项。
在上述过程中,我们在没有使用-C
选项,就自动纵向输出了,故这个选项是缺省的。
-Q选项 --quote-name
功能: 用双引号引起文件名。
使用示例:
- 对照组:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls 123.txt 124.txt a abc a.out code.c
- 对当前目录使用
-Q
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -Q "123.txt" "124.txt" "a" "abc" "a.out" "code.c"
可以发现:当使用-Q
选项后,每个文件或目录都被双引号引起来了。
-N选项
功能:不要用引号引起文件名。
使用示例:
- 对照组:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls 123.txt 124.txt a abc a.out code.c
- 对当前目录使用
-Q
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -Q "123.txt" "124.txt" "a" "abc" "a.out" "code.c"
- 对当前目录使用
-Q
与-N
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -Q -N 123.txt 124.txt a abc a.out code.c
由于直接输出本身就不带双引号,所以-N
选项其实比较鸡肋,要体现其功能,甚至需要先用-Q
创造双引号,再消除它。
-R选项 --recursive
功能:递归列出全部目录的内容。
使用示例:
- 对照组:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls 123.txt 124.txt a abc a.out code.c
- 对当前目录使用
-R
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -R .: 123.txt 124.txt a abc a.out code.c ./a: b ./a/b: c ./a/b/c: d ./a/b/c/d: e ./a/b/c/d/e: f ./a/b/c/d/e/f: ./abc: 1.txt 2.txt 3.txt 4.txt 5.txt
当使用-R
选项后,把从当前目录开始往下的所有目录都展示了出来,甚至把每个目录都作为根进行了一次递归。
-S选项 --sort=size
功能:按文件大小而不是字典序排序目录内容,大文件靠前。
使用示例:
- 对照组:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls 123.txt 124.txt a abc a.out code.c
- 对当前目录使用
-S
选项:
[root@iZf8zdrs09p97o9xxgii5hZ lsInstruction]# ls -S a.out a abc code.c 123.txt 124.txt