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


51

我正在WD My Book World Edition上通过SSH进行工作。基本上,我想从特定的目录级别开始,然后递归地删除所有匹配的子目录.Apple*。我将如何处理?

我试过了

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

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

Answers:


73

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

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

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

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


3
我可以开始find . -type d -name .Apple*工作了-它列出了所有文件夹。但是,当我最后添加时,它将失败-delete。它随使用摘要一起返回。它在BusyBox v1.1.1上运行。这有什么区别吗?
2011年

1
-delete也不是POSIX。**zsh在90年代初期引入的。现在(按出现的时间顺序)还出现在ksh93,鱼,bash和tcsh中。
斯特凡Chazelas

1
+1rm -rf **/.Apple*
Andriy Boyko

1
@codedog,如果-delete不起作用,请-exec rm -f {} +改用。
通配符

1
find删除时您会变得冗长吗?我想“ globstar”方法可以通过添加-v开关来做到这一点。
Demis '18

16

我遇到了问题,使用find-delete因故意行为find(即拒绝删除该路径以./,他们在我的情况做开始)在其手册页指出:

 -delete

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

相反,我能够做到

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

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

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

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

1
没有充分的理由在xargs这里使用。 -exec rm -r {} \;或者更好的-exec rm -r {} +做法是,不会出现特殊字符文件名的情况。请参阅为什么遍历find的输出是错误的做法?
通配符

很高兴知道。IMO值得一提,因为命令仍然可以完成任务,但是性能优化值得赞赏。
2016年

1
如果这只是性能优化,我会同意您的看法,但事实并非如此。这是一个安全漏洞。您没有正确处理名称中带有空格的文件,并且恶意制作的文件名将导致数据丢失。另请参阅忘记在bash / POSIX shell中引用变量的安全隐患其中一些是适用的,并且至少可以让您对我正在谈论的问题类型有所了解。
通配符

mkdir -p $'blah\nDocuments\n/etc\n/home\n/received__output'如果您不相信可能会丢失数据,请尝试在目录中运行,然后再次运行相同的命令。或者,由于问题是关于Mac OS的,因此mkdir -p $'blah\nDocuments\n/Users\n/Applications\n/received__output'。(警告:如果这样做,您将删除所有文件。这是我的意思。)
通配符

0

可能是rm / find命令没有问题,但是您登录的用户实际上没有删除权限。使用ls -l列出的东西与他们的权限,你可以找出你与谁idgroups命令(或者应该可用)。如果您是“错误的用户”,则需要更改文件的权限/所有权,或切换到其他用户。


0

尝试:

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

1
dotglob在这里没用。有关dotglob功能的示例,请参见此页面
amphetamachine

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.