清晰、准确且必要的在 linux 系统中如何快速使用 ls 列出500万个文件。

当目录下有 500w 个文件, ls 命令列出所有的文件花费了 51s, 为什么会这么久呢?

默认 ls 命令会在内存中对输出的文件进行排序

那关闭排序是否可以优化?

ls 命令提供改了 -f 选项用以关闭排序功能

ls -1 -f > ~/filelist.txt

其中

  1. -1 表示一行一个文件名
  2. -f 表示不进行排序

当目录下有 500w 个文件, 如何进行删除?

rm -rf *
-bash: /usr/bin/rm: Argument list too long

如果直接运行 rm -rf * 命令, 会得到一个参数过长的报错, 因为 rm 无法接受 500w 个参数

# 创建一个空目录
mkdir ~/empty
# 将要保留的文件名写在 retention-list.txt 中
cat > ~/retention-list.txt <<EOF
file1
file2
file3
EOF

# 删除除了 retention-list.txt 中的文件, 其中 ~/demo 为要删除文件的目标目录
rsync -av --delete ~/empty/ ~/demo/ --exclude-from=~/retention-list.txt

rsync 会将源目录 ~/empty/ 同步到指定的目标目录 ~/demo/, 此处源目录为空, 因此会期望将空目录同步到指定目录, 也就是删除目标目录中的所有文件

  1. --delete 从目标目录中删除不在源目录的文件
  2. --exclude-from= 从文件列表中排除某些文件
  3. 目录后要加上 / 目录符, 才表示删除目录内的文件, 如果不加, 运行该命令后不会有任何效果
  4. --exclude-from=位置很重要
    • --exclude-from= 要写在 ~/demo/ 之后, 才表示从 ~/demo 目录中排除这些文件
    • 如果写在 ~/empty/~/demo/ 之间, 则表示从 ~/empty 目录中排除文件(原本就是空目录, 等于没有排除任何文件, 运行该命令会删除目标目录下的所有文件)