ls
ls
目录
概述
Linux ls
(英文全拼: list directory contents)命令用于显示指定工作目录下之内容(列出目前工作目录所含的文件及子目录)。
语法
ls [-adfhlrtAFR] [name...]
参数 :
- -a 显示所有文件及目录 (. 开头的隐藏文件也会列出)
- -d 只列出目录(不递归列出目录内的文件)。
- -f 默认排序。-f 用于关闭排序功能。
- -l 以长格式显示文件和目录信息,包括权限、所有者、大小、创建时间等。
- -h 文件大小。
- -r 倒序显示文件和目录。
- -t 将按照修改时间排序,最新的文件在最前面。
- -A 同 -a ,但不列出 "." (目前目录) 及 ".." (父目录)
- -F 在列出的文件名称后加一符号;例如可执行档则加 "*", 目录则加 "/"
- -R 递归显示目录中的所有文件和子目录。
示例与场景使用
ls -l
以长格式显示当前目录中的文件和目录
$ ls -l
total 72
drwxrwxr-x 2 xiaobai xiaobai 4096 Oct 22 16:21 apps
drwxr-xr-x 4 root root 4096 Nov 9 22:36 brew-install-ck
drwxr-xr-x 3 root root 4096 Nov 9 22:07 Desktop
-rw-rw-r-- 1 xiaobai xiaobai 49359 Nov 4 09:56 install.sh
drwxrwxr-x 3 xiaobai xiaobai 4096 Oct 22 16:33 software
drwxrwxr-x 4 xiaobai xiaobai 4096 Nov 20 18:40 workspace
在使用 ls -l 命令时,第一列的字符表示文件或目录的类型和权限。
其中第1位表示文档类型
。第一列的其余 9 个字符表示文件或目录的访问权限,分别对应三个字符一组的 rwx 权限。
第一个字符:
- 表示普通文件
- d 表示目录
- l 表示符号链接
- c 表示字符设备文件
- b 表示块设备文件
- s 表示套接字文件
- p 表示管道文件
第一列的其余 9 个字符:
- r 表示读取权限
- w 表示写入权限
- x 表示执行权限
- 表示没有对应权限
前三个字符表示所有者的权限,中间三个字符表示所属组的权限,后三个字符表示其他用户的权限。
- 表示没有对应权限
ls -a
显示当前目录中的所有文件和目录,包括隐藏文件
$ ls -a
. apps .bash_logout .bashrc .cache install.sh .sdkman .ssh workspace
.. .bash_history .bash_profile brew-install-ck Desktop .pki software .viminfo .zshrc
ls -lh
以人类可读的方式显示当前目录中的文件和目录大小
$ ls -lh
total 72K
drwxrwxr-x 2 xiaobai xiaobai 4.0K Oct 22 16:21 apps
drwxr-xr-x 4 root root 4.0K Nov 9 22:36 brew-install-ck
drwxr-xr-x 3 root root 4.0K Nov 9 22:07 Desktop
-rw-rw-r-- 1 xiaobai xiaobai 49K Nov 4 09:56 install.sh
drwxrwxr-x 3 xiaobai xiaobai 4.0K Oct 22 16:33 software
drwxrwxr-x 4 xiaobai xiaobai 4.0K Nov 20 18:40 workspace
ls -t
按照修改时间排序显示当前目录中的文件和目录(由最近到最远)。
$ ls -t
workspace brew-install-ck Desktop install.sh software apps
ls -R
递归显示当前目录中的所有文件和子目录。
以/bin目录举例,将 /bin 目录以下所有目录及文件详细资料列出。
$ ls -lR /bin
lrwxrwxrwx. 1 root root 7 Jul 11 2019 /bin -> usr/bin
ls -l /etc/passwd
显示/etc/passwd文件的详细信息
$ ls -l /etc/passwd
-rw-r--r-- 1 root root 1132 Nov 5 15:48 /etc/passwd
ls -F
在列出的文件名称后加一符号;例如可执行档则加 "*", 目录则加 "/"
$ ls -F
apps/ brew-install-ck/ Desktop/ install.sh software/ workspace/
列出根目录(\
)下的所有目录
# ls /
bin dev lib media net root srv upload www
boot etc lib64 misc opt sbin sys usr
home lost+found mnt proc selinux tmp var
当文件名包含空格、特殊字符或者开始字符为破折号时,可以使用反斜杠(\
)进行转义,或者使用引号将文件名括起来。
ls "my file.txt" # 列出文件名为"my file.txt"的文件
ls my\ file.txt # 列出文件名为"my file.txt"的文件
ls -- -filename # 列出文件名为"-filename"的文件
ls 命令还可以使用通配符进行模式匹配,
例如 * 表示匹配任意字符,? 表示匹配一个字符,[...] 表示匹配指定范围内的字符。
ls *.txt # 列出所有扩展名为.txt的文件
ls file?.txt # 列出文件名为file?.txt的文件,其中?表示任意一个字符
ls [abc]*.txt # 列出以a、b或c开头、扩展名为.txt的文件
列出目前工作目录下所有名称是 s 开头的文件,越新的排越后面
ls -ltr s*
在Linux下当我们操作一个文件数较少的目录时,例如执行ls列出当前目录下所有的文件,这个命令可能会瞬间执行完毕。
[xiaobai@xiaobai-2c8g ~]$ ls
apps brew-install-ck Desktop install.sh software workspace
[xiaobai@xiaobai-2c8g ~]$ ls -lh
total 72K
drwxrwxr-x 2 xiaobai xiaobai 4.0K Oct 22 16:21 apps
drwxr-xr-x 4 root root 4.0K Nov 9 22:36 brew-install-ck
drwxr-xr-x 3 root root 4.0K Nov 9 22:07 Desktop
-rw-rw-r-- 1 xiaobai xiaobai 49K Nov 4 09:56 install.sh
drwxrwxr-x 3 xiaobai xiaobai 4.0K Oct 22 16:33 software
drwxrwxr-x 3 xiaobai xiaobai 4.0K Oct 22 16:22 workspace
[xiaobai@xiaobai-2c8g ~]$ time ls -l
total 72
drwxrwxr-x 2 xiaobai xiaobai 4096 Oct 22 16:21 apps
drwxr-xr-x 4 root root 4096 Nov 9 22:36 brew-install-ck
drwxr-xr-x 3 root root 4096 Nov 9 22:07 Desktop
-rw-rw-r-- 1 xiaobai xiaobai 49359 Nov 4 09:56 install.sh
drwxrwxr-x 3 xiaobai xiaobai 4096 Oct 22 16:33 software
drwxrwxr-x 3 xiaobai xiaobai 4096 Oct 22 16:22 workspace
real 0m0.005s
user 0m0.003s
sys 0m0.003s
[xiaobai@xiaobai-2c8g ~]$ time ls -l | wc -l
7
real 0m0.006s
user 0m0.004s
sys 0m0.004s
在linux系统中如何快速ls列出100万+个文件
但是当一个目录下有上百万个文件时,执行ls命令会发生什么呢?
数据准备,在文件夹 workspace/linux/100w_dir 下,创建 100w 个文件。
mkdir -p workspace/linux/100w_dir
cd workspace/linux/100w_dir
for i in {1..1000000}; do echo 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' > $i.txt ; done
再次执行上述命令 time ls -l | wc -l
或者 time ls -l &> /dev/null
:
[xiaobai@xiaobai-2c8g 100w_dir]$ time ls -l | wc -l
1000001
real 0m17.413s
user 0m8.237s
sys 0m9.387s
可以看到,统计一个包含1000000个小文件的目录下的文件个数花费了将近17秒的时间。
我们把 -l
选项去掉再看一次?
$ time ls | wc -l
1000000
real 0m5.678s
user 0m5.153s
sys 0m0.571s
可以看到,统计一个包含1000000个小文件的目录下的文件个数花费了仍然5秒多的时间 。
那么文件个数多造成ls缓慢的原因是什么呢?
默认 ls 命令会在内存中对输出的文件进行排序。
那如果关闭排序功能,速度会不会快很多呢?
ls 命令提供了 -f 选项,用于关闭排序功能。
$ man ls | grep -w "\-f"
-f do not sort, enable -aU, disable -ls --color
$ time ls -f | wc -l
1000002
real 0m0.543s
user 0m0.183s
sys 0m0.407s
可以看到这次只用了0.5秒。
借助这个选项,我们可以快速的把一个大文件夹中的所有文件名都导入到一个名为 filelist.txt 的文件中
$ time ls -1 -f > ~/filelist.txt
real 0m0.541s
user 0m0.162s
sys 0m0.382s
当然,如果有心情,也可以将文件内容排个序,也可以。