报告“参数列表太长”时如何删除目录中的所有文件

Bre*_*nt 11 linux debian

我有一个目录,里面有几十万个文件。

我想删除所有文件,但 rm * -f 报告:“参数列表太长”

清除此目录的最佳方法是什么?

asd*_*min 21

找 。-maxdepth 1 -type f -exec rm -f {} \;

它只需要太长时间(每个文件执行一个 rm )。

这个效率更高:

找 。-maxdepth 1 -type f -print0 | xargs -r0 rm -f

因为它需要尽可能多的文件名作为 rm 的参数,然后在下一次加载文件名的情况下运行 rm ...... rm 可能只被调用 2 或 3 次。

  • 很高兴看到有人知道 find 是如何工作的...还可以考虑使用新的 gnu find 的 -delete 操作或 -exec 命令 {} +,其作用类似于 xargs。请参阅“man find”的“操作”部分。 (5认同)
  • 如果计算机被其他人同时使用,在 `rm` 之前添加 `ionice` 是一个好主意。 (2认同)

skr*_*ggy 11

如果您无法删除目录,您可以随时使用 find。

find . -maxdepth 1 -type f -exec rm -f {} \;
Run Code Online (Sandbox Code Playgroud)

这将删除当前目录中的所有文件,并且只删除当前目录(而不是子目录)。

  • 更快:`find dir/to/delete -delete`(不会为每个要删除的文件生成一个 `rm` 进程)。 (5认同)
  • 在 linux 上,您可以通过使用“+”而不是“\;”来更快地完成。这将导致它一次性删除每个“rm”的更多文件。 (2认同)

Coo*_*ops 6

这两个都可以解决问题。有在每个技术的各自表现的分析在这里

find . -name WHATEVER -exec rm -rf {} \;
Run Code Online (Sandbox Code Playgroud)

或者

ls WHATEVER | xargs rm -rf
Run Code Online (Sandbox Code Playgroud)

问题源于 bash 用目录中的每个项目扩展“*”。这两种解决方案都依次处理每个文件。

  • find 解决方案对于许多文件来说较慢,因为它为每个文件调用 rm 命令。xargs 解决方案更快,但它仅在文件名不包含空格时才有效(否则您需要 GNU find 和 `find . -print0 | xargs -0 rm`)。 (2认同)
  • 您正在执行“`ls *`”,并且“`*`”扩展为您的shell 抱怨太长的参数列表。改为执行“`ls .`”(或上一级目录并执行“`ls [dirname]`”)。 (2认同)