侧边栏壁纸
博主头像
Easy to understand and humorous

行动起来,活在当下

  • 累计撰写 39 篇文章
  • 累计创建 4 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

在linux系统中如何快速ls列出100万+个文件

fengyang
2025-08-22 / 0 评论 / 0 点赞 / 13 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

概述

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

当然,如果有心情,也可以将文件内容排个序,也可以。

0

评论区