删除目录中除 1000 个随机文件之外的所有文件

删除目录中除 1000 个随机文件之外的所有文件

我让数据生成脚本运行的时间太长了,现在有 200,000 多个文件,我需要将其减少到 1000 个左右。从 Linux 命令行,有没有一种简单的方法可以删除除 1000 个文件之外的所有文件,其中保留的文件不依赖于文件名或任何其他属性?

答案1

删除目录中除 1000 个随机文件之外的所有文件

代码:

find /path/to/dir -type f -print0 | sort -zR | tail -zn +1001 | xargs -0 rm

解释:

  1. /path/to/dir使用列出所有文件find
    • print0: 使用 \0空字符) 作为行分隔符;因此包含空格/换行符的文件路径不会破坏脚本
  2. sort使用; 随机排列文件列表
    • -z:使用\0(空字符)作为分隔符,而不是\n(换行符)
    • -R: 随机顺序
  3. tail使用; 从随机列表中删除前 1000 行
    • -z:将列表视为零分隔符(与 相同sort
    • -n +1001:显示从 1001 开始的行(即省略前 1000 行)
  4. xargs -0 rm- 删除剩余文件;
    • -0:再次以零分隔

为什么它比不切实际的解决方案*:

  1. 适用于包含空格/换行符的文件名。
  2. 不尝试创建任何目录(顺便说一下,这些目录可能已经存在)
  3. 不移动任何文件,除了用 列出它们之外甚至不触碰 1000 个“幸运文件” find
  4. 避免因某种原因输出find没有以(换行符)结尾而丢失文件。\n

* - 归功于不切实际的因为| sort -R | head -1000,给了我一个起点。

答案2

使用临时目录,然后是find所有文件,使用 随机化列表sort,并将列表的前 1000 个文件移至临时目录。删除其余文件,然后将文件从临时目录移回。

$ mkdir ../tmp-dir
$ find . -type f | sort -R | head -1000 | xargs -I "I" mv I ../tmp-dir/
$ rm ./*
$ mv ../tmp-dir/* .

如果xargs抱怨行长,请使用较小的数字head并根据需要重复该命令(即,更改-1000-500并运行两次,或更改为-200并运行五次。)

它还无法处理包含空格的文件名;因为@rld 的回答显示,您可以使用find-print0参数、和-z的参数以及来确保正确的文件名处理。sorthead-0xargs

最后,如果tmp-dir已经存在,则应该用不存在的目录名替换。

答案3

对于 Mac 用户,可以使用以下脚本。

find . -type f -print0 | tr '\0' '\n' | sort -R | tail -n +10000 | tr '\n' '\0' | xargs -0 rm

tr将允许 sort 和 tail 使用\n而不是 来对列表进行操作\0

答案4

最简单的方法可能是 rm -rf 目录,然后重新运行数据生成脚本,同时确保不要运行太长时间。

相关内容