我让数据生成脚本运行的时间太长了,现在有 200,000 多个文件,我需要将其减少到 1000 个左右。从 Linux 命令行,有没有一种简单的方法可以删除除 1000 个文件之外的所有文件,其中保留的文件不依赖于文件名或任何其他属性?
答案1
删除目录中除 1000 个随机文件之外的所有文件
代码:
find /path/to/dir -type f -print0 | sort -zR | tail -zn +1001 | xargs -0 rm
解释:
/path/to/dir
使用列出所有文件find
;print0
: 使用\0
(空字符) 作为行分隔符;因此包含空格/换行符的文件路径不会破坏脚本
sort
使用; 随机排列文件列表-z
:使用\0
(空字符)作为分隔符,而不是\n
(换行符)-R
: 随机顺序
tail
使用; 从随机列表中删除前 1000 行-z
:将列表视为零分隔符(与 相同sort
)-n +1001
:显示从 1001 开始的行(即省略前 1000 行)
xargs -0 rm
- 删除剩余文件;-0
:再次以零分隔
为什么它比不切实际的解决方案*:
- 适用于包含空格/换行符的文件名。
- 不尝试创建任何目录(顺便说一下,这些目录可能已经存在)
- 不移动任何文件,除了用 列出它们之外甚至不触碰 1000 个“幸运文件”
find
。 - 避免因某种原因输出
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
的参数以及来确保正确的文件名处理。sort
head
-0
xargs
最后,如果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 目录,然后重新运行数据生成脚本,同时确保不要运行太长时间。