我正在 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
在使用时遇到了问题:-delete
find
-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
祝你好运!