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

Mal*_*gan 13 linux

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

rld*_*ld. 18

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

代码:

find /path/to/dir -type f -print0 | sort -zR | tail -zn +1001 | xargs -0 rm
Run Code Online (Sandbox Code Playgroud)

解释:

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

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

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

* - 归功于quixotic for | sort -R | head -1000,给了我一个起点。

  • `tail: invalid option -- 'z'` 我的tail版本是8.4 (3认同)