如何在Linux中使用`find`命令删除非空目录?

oro*_*aki 8 linux bash find

我有充满垃圾的临时目录,都以__temp__(例如__temp__user_uploads)开头,我想用清理功能删除它.我的功能尝试是运行:

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

如果我运行命令并且有多个__temp__目录(__temp__foo__temp__bar),我得到输出:

find: __temp__foo: unknown option
Run Code Online (Sandbox Code Playgroud)

如果我运行命令并且只有一个__temp__目录(__temp__foo),它将被删除,我得到输出:

find: ./__temp__foo: No such file or directory
Run Code Online (Sandbox Code Playgroud)

为什么命令不起作用,为什么它不一致,我该如何解决呢?

pil*_*row 25

使用深度优先搜索并引用(或转义)shell元字符*:

find . -depth -name '__temp__*' -exec rm -rf '{}' \;
Run Code Online (Sandbox Code Playgroud)

说明

如果没有该-depth标志,您的find命令将删除匹配的文件名,然后尝试进入(现在未链接的)目录.这是单个__temp__目录案例中"No such file or directory"的起源.

在不引用或转义的情况下*,shell将扩展该模式,匹配__temp__whatever当前工作目录中的多个文件名.这种扩展会让人find感到困惑,因为它在参数列表中期望选项而不是文件名.

  • 作为效率和紧密性改进,假设GNU实用程序(因为OP在Linux上),我实际上建议`find.-maxdepth 1-type d -name'__temp __*' - print0 | xargs -0 rm -rf`. (6认同)
  • @orokusaki:`-exec`本身就不错*,但它会为匹配的每个文件触发一次:`rm foo`,然后`rm bar`,依此类推.`xargs`会将许多文件名作为参数传递给它的子命令,因此效率更高:`rm foo bar ...`除非你有数千个文件,否则`xargs`可能只会调用`rm`的一个实例 (2认同)
  • @orokusaki:这是正确的,-exec将在每次找到文件时执行一次,然后在这种情况下将继续分叉外部命令"rm".但是,如果你使用"| xargs",那么find将找到所有文件,将它们存储在一个数组中,然后将整串数组传递给"xmgs"调用的"rm",例如rm -fr foo bar qux垃圾邮件鸡蛋等+1再次为了查询xargs的pilcrow. (2认同)