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


13

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


创建文件的过程是否具有将每个文件与上一个文件相关联的特征?如果是这样,那么比随机选择对于获得代表性样本更重要。如果该进程生成的文件本质上是随机的,则可以删除前1000个文件之后的所有文件
。– fixer1234

Answers:


15

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

码:

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

说明:

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

为什么它比quixotic的解决方案要好*:

  1. 使用包含空格/换行符的文件名。
  2. 不要尝试创建任何目录(可能已经存在,顺便说一句)。
  3. 除了用列出文件外,不移动任何文件,甚至不触摸1000个“幸运文件” find
  4. 避免由于某种原因而导致文件的输出find不以\n(换行符)结尾的情况而丢失文件。

* -信贷不切实际| sort -R | head -1000,给了我一个起点。


在CentOS 6上运行时,我收到有关无效操作数的错误。幸运的是,我不关心文件路径中的空格,因此删除那些对我find . -type f | sort -R | tail -n +1001 | xargs rm
有用的

@brad能否提供错误消息和您的版本find?我将尝试改善答案,只需要一些输入即可使用。
rld。

3
tail: invalid option -- 'z'我的尾巴版本是8.4
布拉德

我会在xargs中添加--no-run-if-empty,以避免在没有文件的情况下出错(例如,在两次运行后)
fraff

1

使用一个临时目录,然后使用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并运行5次。)

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

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


如果列出的任何文件名都find包含空格,则此操作将失败。
rld。

0

对于Mac用户,以下脚本应该执行。

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

tr将允许sort和tail使用\n代替来处理列表\0


-2

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


那不是OP问的。也许这样做是不可行的。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.