Linux常用命令-ls

命令

ls

描述

list directory contents
显示目录或文件

用法

1
ls [OPTION]... [FILE]... [DIR]...

选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
Options:
-a 显示所有隐藏文件,默认不显示隐藏文件
-A 显示隐藏文件,但不包括.和..
-B 不显示备份文件,即以~结尾的文件
-c 配合-lt使用则显示ctime并以ctime排序;配合-l使用则显示ctime并以名称排序;否则以ctime排序,最新优先
-C 按列显示
-d 显示目录本身属性而非目录下的内容
-f 不进行排序直接列出所有文件列表,默认会以文件名进行排序后再显示,等同于-aU选项
-g 列表显示,只显示group
-h 自动转换进制,如10K,20M
-i 显示inode值
-I 不显示指定的文件,注意如果要指定多个文件则需要同时指定多个-I选项
-l 列表显示详细信息
-L 显示链接文件的源文件信息而非链接文件本身
-m 用,号作为分隔符,默认为空格
-n 显示uid和gid
-o 列表显示,只显示owner
-p 目录后显示/
-Q 文件名加""号
-r 倒序排列,默认排序为按文件名从0-9,aA,bB,cC...zZ
-R 递归显示
-s 显示文件的块大小
-S 按文件大小排序,默认从大到小
-t 以mtime排序,最新优先
-u 配合-lt使用则显示atime并以atime排序;配合-l使用则显示atime并以名称排序;否则以atime排序
-U 不排序,按目录原本存放顺序显示
-x 按行显示
-X 按文件后缀排序
-1 每行显示一个文件名

--block-size=SIZE 指定显示单位,如'--block-size=M',可选单位为1024次方计算的K,M,G...,或者1000次方的KB,MB,GB...
--color[=WHEN] 显示颜色,WHEN可选参数为never,auto,always(默认)
--full-time 以full-iso时间格式列表显示,等同于'-l --time-style=full-iso'选项
--group-directories-first 优先显示目录
--hide=PATTERN 隐藏显示匹配的文件
--time-style=STYLE 指定时间格式,配合-l使用,STYLE可选项为full-iso,long-iso,iso,locale,+FORMAT. FORMAT格式参考date命令

SIZE
K, M, G, T, P, E, Z, Y (1024) 10M=10*1024*1024
KB, MB, GB, TB... (1000) 10MB=10*1000*1000

通配符和正则表达式
通配符用于文件名匹配,支持的命令有ls,cp,rm等;正则为通用匹配,支持的命令有grep,awk,sed,vi,find等
注意区别:通配符的*指的是匹配零个或多个任意字符,正则表达式的*指的是匹配前一个字符零次或多次

通配符
* 匹配零个或多个任意字符
? 匹配单个任意字符
[] 匹配指定范围内的单个字符
^ 取反,注意非数字包含字母,特殊字符和汉字;非字母包含数字,特殊字符和汉字.一个汉字等于一个字符
~ 当前用户家目录
~usera 用户usera家目录
~+ 当前工作目录
~- 前一个工作目录
[0-9] 匹配数字
[a-Z] 匹配任意大小写字母,注意是小写a-大写Z,即匹配范围为aA,bB,cC...zZ
[wang] 匹配列表中的任何一个字符,而非单词本身
[^wang] 匹配除了列表中的字符以外的所有字符

POSIX字符
[[:digit:]] 任意数字,即[0-9]
[[:lower:]] 任意小写字母
[[:upper:]] 任意大写字母
[[:alpha:]] 任意大小写字母,即[a-Z]小写a-大写Z
[[:alnum:]] 任意数字或字母,即[0-Z]零-大写Z
[[:blank:]] 水平空白字符
[[:space:]] 水平或垂直空白字符
[[:punct:]] 标点符号
[[:print:]] 可打印字符
[[:cntrl:]] 控制(非打印)字符
[[:graph:]] 图形字符
[[:xdigit:]] 十六进制字符,即[0-9a-F]

注意

ls参数支持单个或多个文件或目录,也可以两者混合,如果是目录的话默认会自动扩展显示目录下的文件

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
# 默认执行的ls命令是修改过的别名命令
$ which ls
alias ls='ls -p --color=auto'
/usr/bin/ls
$ ls
a a1 a1~ b c d d1 dir1/ dir2/
# 执行原始的ls命令可以使用绝对路径或加\转义
$ /usr/bin/ls
a a1 a1~ b c d d1 dir1 dir2
$ \ls
a a1 a1~ b c d d1 dir1 dir2
$ touch .abc
# -a显示所有隐藏文件
$ \ls -a
. .. a a1 a1~ .abc b c d d1 dir1 dir2
# -A显示隐藏文件,但是不包括.和..
$ \ls -A
a a1 a1~ .abc b c d d1 dir1 dir2
# -B不显示以~结尾的文件
$ \ls -B
a a1 b c d d1 dir1 dir2

# 默认按列显示
$ \ls /usr/bin/ |head
[
a2p
addr2line
alias
apropos
ar
arch
as
aserver
audit2allow
# -C按列显示
$ \ls -C /usr/bin/ |head
[ nl-classid-lookup
a2p nl-class-list
addr2line nl-cls-add
alias nl-cls-delete
apropos nl-cls-list
ar nl-fib-lookup
arch nl-link-enslave
as nl-link-ifindex2name
aserver nl-link-list
audit2allow nl-link-name2ifindex
# -x按行显示
$ \ls -x /usr/bin/ |head
[ a2p
addr2line alias
apropos ar
arch as
aserver audit2allow
audit2why aulast
aulastlog ausyscall
autoexpect autojump
auvirt awk
base64 basename

# 默认显示目录下的内容
$ \ls -l dir1
-rw-r--r-- 1 root root 0 Feb 9 16:24 aa
-rw-r--r-- 1 root root 0 Feb 9 16:24 ab
# -d显示目录本身的属性而非目录下的内容
$ \ls -dl dir1
drwxr-xr-x 2 root root 26 Feb 9 16:24 dir1
# 默认会自动排序
$ \ls
a a1 a1~ b c d d1 dir1 dir2
# -f不排序直接显示所有文件列表
$ \ls -f
. .. a b c dir1 dir2 d1 a1~ a1 d .abc
# 默认同时显示owner和group
$ ll /etc/chrony.keys
-rw-r-----. 1 root chrony 481 Aug 8 2019 /etc/chrony.keys
# -g只显示group
$ \ls -g /etc/chrony.keys
-rw-r-----. 1 chrony 481 Aug 8 2019 /etc/chrony.keys
# -o只显示owner
$ \ls -o /etc/chrony.keys
-rw-r-----. 1 root 481 Aug 8 2019 /etc/chrony.keys
# -h自动转换单位
$ \ls -hl /usr/bin/bash
-rwxr-xr-x. 1 root root 942K Apr 1 2020 /usr/bin/bash
$ \ls -hl /usr/bin/vim
-rwxr-xr-x. 1 root root 2.3M Dec 16 00:44 /usr/bin/vim
# -i显示inode值
$ \ls -i
33595993 a 33595997 a1~ 33595995 c 33595996 d1 1228830 dir2
33595998 a1 33595994 b 33595999 d 50888629 dir1
$ \ls -il
33595993 -rw-r--r-- 1 root root 4 Feb 9 14:45 a
33595998 lrwxrwxrwx 1 root root 1 Feb 9 14:59 a1 -> a
33595997 lrwxrwxrwx 1 root root 1 Feb 9 14:58 a1~ -> a
33595994 -rw-r--r-- 1 root root 3 Feb 9 15:00 b
33595995 -rw-r--r-- 1 app app 0 Feb 9 14:44 c
33595999 -rw-r--r-- 1 app root 0 Feb 9 15:13 d
33595996 lrwxrwxrwx 1 root root 4 Feb 9 14:45 d1 -> dir1
# -I 不显示指定的文件,注意-I选项一次只能指定一个文件,多个文件则需要指定多次
$ \ls
a a1 a1~ b c d d1 dir1 dir2
# 如下不显示a b c三个文件
$ \ls -I a -I b -I c
a1 a1~ d d1 dir1 dir2
# -m用,号作为分隔符
$ \ls -m
a, a1, a1~, b, c, d, d1, dir1, dir2
# -Q文件名加""号
$ \ls -Q
"a" "a1" "a1~" "b" "c" "d" "d1" "dir1" "dir2"
$ \ls -n
total 8
-rw-r--r-- 1 0 0 4 Feb 9 14:45 a
lrwxrwxrwx 1 0 0 1 Feb 9 14:59 a1 -> a
lrwxrwxrwx 1 0 0 1 Feb 9 14:58 a1~ -> a
-rw-r--r-- 1 0 0 3 Feb 9 15:00 b
-rw-r--r-- 1 1001 1001 0 Feb 9 14:44 c
-rw-r--r-- 1 1001 0 0 Feb 9 15:13 d
lrwxrwxrwx 1 0 0 4 Feb 9 14:45 d1 -> dir1
drwxr-xr-x 2 0 0 26 Feb 9 16:24 dir1
drwxr-xr-x 2 0 0 26 Feb 9 16:24 dir2
# -p目录后显示/标识
$ \ls -p
a a1 a1~ b c d d1 dir1/ dir2/
$ \ls
a a1 a1~ b c d d1 dir1 dir2
# -r倒序排列
$ \ls -r
dir2 dir1 d1 d c b a1~ a1 a
# -R递归显示目录中的文件
$ \ls -R
.:
a a1 a1~ b c d d1 dir1 dir2
./dir1:
aa ab
./dir2:
cc cd
# -S按文件大小排序,从大到小排序
$ \ls -Sl
drwxr-xr-x 2 root root 26 Feb 9 16:24 dir1
drwxr-xr-x 2 root root 26 Feb 9 16:24 dir2
-rw-r--r-- 1 root root 4 Feb 9 14:45 a
lrwxrwxrwx 1 root root 4 Feb 9 14:45 d1 -> dir1
-rw-r--r-- 1 root root 3 Feb 9 15:00 b
lrwxrwxrwx 1 root root 1 Feb 9 14:59 a1 -> a
lrwxrwxrwx 1 root root 1 Feb 9 14:58 a1~ -> a
-rw-r--r-- 1 app app 0 Feb 9 14:44 c
-rw-r--r-- 1 app root 0 Feb 9 15:13 d
# 从小到大排序
$ \ls -Srl
-rw-r--r-- 1 app root 0 Feb 9 15:13 d
-rw-r--r-- 1 app app 0 Feb 9 14:44 c
lrwxrwxrwx 1 root root 1 Feb 9 14:58 a1~ -> a
lrwxrwxrwx 1 root root 1 Feb 9 14:59 a1 -> a
-rw-r--r-- 1 root root 3 Feb 9 15:00 b
lrwxrwxrwx 1 root root 4 Feb 9 14:45 d1 -> dir1
-rw-r--r-- 1 root root 4 Feb 9 14:45 a
drwxr-xr-x 2 root root 26 Feb 9 16:24 dir2
drwxr-xr-x 2 root root 26 Feb 9 16:24 dir1
# -t按文件的mtime排序
$ \ls -tl
total 8
drwxr-xr-x 2 root root 26 Feb 9 16:24 dir2
drwxr-xr-x 2 root root 26 Feb 9 16:24 dir1
-rw-r--r-- 1 app root 0 Feb 9 15:13 d
-rw-r--r-- 1 root root 3 Feb 9 15:00 b
lrwxrwxrwx 1 root root 1 Feb 9 14:59 a1 -> a
lrwxrwxrwx 1 root root 1 Feb 9 14:58 a1~ -> a
-rw-r--r-- 1 root root 4 Feb 9 14:45 a
lrwxrwxrwx 1 root root 4 Feb 9 14:45 d1 -> dir1
-rw-r--r-- 1 app app 0 Feb 9 14:44 c
$ touch a.a a.b c.c c.d aa.a aa.c
# -X以文件后缀排序
$ \ls -X
a a1 a1~ b c d d1 dir1 dir2 a.a aa.a a.b aa.c c.c c.d
# -1每行只显示1个文件名
$ \ls -1
a
a1
a1~
a.a
aa.a
aa.c
a.b
b
c
c.c
c.d
d
d1
dir1
dir2
# 自动显示文件颜色
$ \ls --color=auto
a a1 a1~ a.a aa.a aa.c a.b b c c.c c.d d d1 dir1 dir2
# 以full-iso时间格式列表显示
$ \ls --full-time a
-rw-r--r-- 1 root root 4 2021-02-09 14:45:19.847133578 +0800 a
# 默认时间格式为 locale
$ \ls -l a
-rw-r--r-- 1 root root 4 Feb 9 14:45 a
# 指定不同的时间格式
$ \ls -l --time-style=full-iso a
-rw-r--r-- 1 root root 4 2021-02-09 14:45:19.847133578 +0800 a
$ \ls -l --time-style=long-iso a
-rw-r--r-- 1 root root 4 2021-02-09 14:45 a
$ \ls -l --time-style=iso a
-rw-r--r-- 1 root root 4 02-09 14:45 a
$ \ls -l --time-style=locale a
-rw-r--r-- 1 root root 4 Feb 9 14:45 a
# 自定义时间格式,参考date命令时间格式
$ \ls -l --time-style=+%Y%m%d-%T a
-rw-r--r-- 1 root root 4 20210209-14:45:19 a

# 显示当前文件的绝对路径有两种方式ls ~+/*或ls `pwd`/*
$ ls
a
$ ls ~+/a
/tmp/aaa/a
$ touch b c
# 显示所有文件的绝对路径
$ ls ~+/*
/tmp/aaa/a /tmp/aaa/b /tmp/aaa/c
# 或
$ pwd
/tmp/aaa
# 显示所有文件的绝对路径
$ ls `pwd`/*
/tmp/aaa/a /tmp/aaa/b /tmp/aaa/c

# 显示目录下的隐藏目录,包括.和..
$ ls -d .*/
# 显示目录下的非隐藏目录
$ ls -d */
# 显示所有以数字开头的文件或目录
$ ls [[:digit:]]*

# 递归显示所有子目录下的后缀为.md的文件列表
$ ls **/*.md
# 递归显示所有子目录下的以a开头的文件列表
$ ls **/a*
# 递归显示所有子目录下的文件名包含12的文件列表
$ ls **/*12*

通配符示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
[123]  注意这里表示单个数字1或2或3,而非123
[1-5] 匹配1-5
[135] 匹配1,3,5
8[0-9] 匹配数字80-89
1[0-9][0-9] 匹配数字100-199
[0-9][0-9] 匹配所有两位数
[0-9][0-9][0-9] 匹配所有三位数
[^123] 不包括1,2,3之外的所有单个字符
[0-9] 匹配数字0-9
[^0-9] 非数字,即匹配所有大小写字母和特殊字符
[a-Z] 匹配所有大小写字母,排序为a,A,b,B,c,C...z,Z
[0-Z] 零到大写Z,即匹配所有数字和大小写字母,顺序为0-9,a,A,b,B,c,C...y,Y,z,Z
[^0-Z] 匹配特殊字符
[a-z] 注意这里并非匹配的是a-z,而是除了大写Z之外的字母
[A-Z] 注意这里并非匹配的是A-Z,而是除了小写a之外的字母

[a-c] 匹配a,A,b,B,c
[a-C] 匹配a,A,b,B,c,C
[A-C] 匹配A,b,B,c,C
[ACdf] 匹配A,C,d,f
[^a-d] 匹配除了a,A,b,B,c,C,d
[wang] 匹配列表中的任意一个字符w,a,n,g
[^wang] 匹配列表中的所有字符以外的字符
[5-9a-CZ] 数字字母支持混合,匹配5-9,a,A,b,B,c,C,Z
[[:lower:]] 匹配小写字母a,b,c,d...
[[:upper:]] 匹配大写字母A,B,C,D...

字符位说明
[0-9]或[a-Z]或[0-Z] 表示匹配一个字符位,如0,1,9,a,A,z,Z
[a-Z][0-9] 表示匹配两个字符位,且首位为字母,第二位为数字,如a1,b2,c9,Z8,K6
[0-9]?? 表示匹配三个字符位,且首位为数字,如010,2ai,98h,66Z
[0-9]* 表示匹配一个或多个字符位,且首位为数字,如1,12,800,10ab,39KEaL
[^0-9]* 表示匹配一个或多个字符位,且首位不是数字,如a,ab,a102,NCo3la

通配符匹配示例
touch {A..z} 创建大小写字母和5个特殊字符 "`_^][",注意这里的大括号{A..z}并不是通配符
touch {0..9} f{A..z} f{0..9} f汉 f汉字 f.log
touch f21 f23 f24 f234 f32 f35 f63 f-1 f-12 fa_b f4422 faaa4d35 faaa4d3rr5
ls f[1,2,3] 显示f1,f2,f3
ls f[123] 显示f1,f2,f3
ls f[23] 显示f2,f3
ls f[2323] 显示f2,f3
ls f[2,3,23] 显示f2,f3
ls f[23]* 显示f2 f21 f23 f234 f24 f3 f32 f35
ls f[23]? 显示f21 f23 f24 f32 f35,等同于f2?和f3?
ls f*[23]? 显示f21 f23 f234 f24 f32 f35 f4422 faaa4d35,等同于f*2?和f*3?
ls f*3* 显示f23 f234 f3 f32 f35 f63 faaa4d35 faaa4d3rr5
ls f*[123] 显示f1 f-1 f-12 f2 f21 f23 f3 f32 f4422 f63
ls f?[123] 显示f-1 f21 f23 f32 f63
ls [aBZ] 显示a B Z
ls [^aBZ] 显示非a,B,Z之外的单个字符,包括数字和大小写字母,以及特殊符号,还有汉字
ls [^aBZ5-9] 显示非a,B,Z,5-9之外的单个字符
ls f? 可以匹配到f汉,说明一个汉字也属于一个字符
ls f???? 可以匹配到f.log,说明后缀也属于字符长度
ls *.* 匹配所有带有后缀名的文件,或者文件名中有.的文件
ls *-* 匹配所有文件名中带有-的文件
ls *_* 匹配下划线

touch /root/d1/-al 创建-al文件,注意-开头的文件增删改查都必须指定绝对路径,而且-文件无法用通配符匹配过滤,可匹配到的即自动认为是命令参数直接运行,危险!
ls ??l 显示为执行后的结果,即匹配到-al后自动作为ls的参数执行,ls -al

有趣的实验-通过创建命令文件来删除文件
创建文件
mkdir ~/d1
cd ~/d1
touch {0..9} {A..z}
第一种删除
touch /root/d1/-rf 创建-rf这个文件
ls
rm ??f a b c A B C 1 2 3 通配符??f可以匹配到-rf这个文件名,用来作为rm命令的参数
rm ??f [^0-9] 删除非数字字符
mv 9 999
rm ??? 自动删除999,即删除与-rf位数匹配(都是3位)的文件
rm ??? * 删除所有,但是无法删除-rf文件
rm -rf * 此命令同上,无法删除-rf文件,需添加绝对路径
rm ??? ~/d1/-rf 成功删除
第二种删除
touch rm\ \-rf\ \* 创建rm -rf *这个文件
ls rm* 匹配到rm -rf *这个文件,是否可以执行呢
ls [r]*[r]??? 也可以匹配到,怎么执行呢
ls rm*|/bin/bash 用管道交给bash执行即可,这时当前目录下所有文件均被删除