如何使用通配符递归删除目录?

cod*_*dog 72 recursive wildcards rm

我正在 WD My Book World Edition 上通过 SSH 工作。基本上我想从特定的目录级别开始,并递归地删除所有匹配.Apple*. 我该怎么做?

我试过

rm -rf .Apple*rm -fR .Apple*

都没有删除子目录中与该名称匹配的目录。

Sha*_*off 89

find 对于选择性地对整棵树执行操作非常有用。

find . -type f -name ".Apple*" -delete
Run Code Online (Sandbox Code Playgroud)

在这里,-type f确保它是一个文件,而不是一个目录,并且可能不是你想要的,因为它还会跳过符号链接、套接字和其他东西。您可以使用! -type d,它的字面意思是不是目录,但是您也可以删除字符设备和块设备。我建议查看-type手册页上的谓词find

要严格使用通配符,您需要高级 shell 支持。Bash v4 有一个globstar选项,它允许您使用**. zsh并且ksh也支持这种模式。使用它,你可以做rm -rf **/.Apple*. 这不是 POSIX 标准,也不是很便携,所以我会避免在脚本中使用它,但对于一次性交互式 shell 操作,这很好。

  • +1 为 `rm -rf **/.Apple*` (8认同)
  • 我可以得到`find 。-type d -name .Apple*` 工作 - 它列出了所有文件夹。但是,当我在最后添加 `-delete` 时它失败了。它只是返回使用摘要。它在 BusyBox v1.1.1 上运行。这有什么区别吗? (4认同)
  • `-delete` 也不是 POSIX。`**` 是由 `zsh` 在 90 年代初引入的。现在(按出现的时间顺序)它也在 ksh93、fish、bash 和 tcsh 中。 (2认同)

Pat*_*Pat 21

由于其手册页中所述的故意行为(即,如果路径以 ./ 开头,则拒绝删除,在我的情况下他们这样做),我在使用find时遇到了问题:-deletefind

 -delete
Run Code Online (Sandbox Code Playgroud)

删除找到的文件和/或目录。总是返回真。这从当前工作目录执行,因为 find 在树中递归。它不会尝试删除相对于“.”的路径名中带有“/”字符的文件名。出于安全原因。
此选项隐含了深度优先遍历处理。
以下符号链接与此选项不兼容。

相反,我能够做到

find . -type d -name 'received_*_output' -exec rm -r {} +
Run Code Online (Sandbox Code Playgroud)

对于您的情况,似乎引用 glob (asterisk, *) 是解决方案,但我想提供我的答案,以防其他人遇到类似问题。

注意:以前,我的回答是执行以下操作,但@Wildcard 在评论中指出了这样做的安全漏洞。

find . -type d -name 'received_*_output' | xargs rm -r
Run Code Online (Sandbox Code Playgroud)

  • 没有充分的理由在这里使用“xargs”。`-exec rm -r {} \;` 或者更好的是, `-exec rm -r {} +` 也可以,不会在特殊字符文件名上失败。请参阅[为什么循环查找的输出是不好的做法?](http://unix.stackexchange.com/q/321697/135943) (2认同)