如何递归删除带有通配符的目录?

如何递归删除带有通配符的目录?

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

我试过

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

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

答案1

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

find . -type f -name ".Apple*" -delete

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

要严格使用通配符执行此操作,您需要高级 shell 支持。Bash v4 具有globstar选项,它允许您使用 递归匹配子目录**zsh并且ksh也支持这种模式。使用它,你可以做到rm -rf **/.Apple*。这不是 POSIX 标准,也不太可移植,因此我会避免在脚本中使用它,但对于一次性交互式 shell 操作来说,这很好。

答案2

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

 -delete

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

相反,我能够做

find . -type d -name 'received_*_output' -exec rm -r {} +

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

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

find . -type d -name 'received_*_output' | xargs rm -r

答案3

尝试:

shopt -s dotglob           # using Bash
printf '%s\n' ./.Apple*    # test
#rm -rf ./.Apple*    

答案4

简单命令:

rm `find ./ -name '.Apple*'` -rf

祝你好运!

相关内容