Answers:
find
对于选择性地对整个树执行操作非常有用。
find . -type f -name ".Apple*" -delete
在这里,请-type f
确保它是一个文件,而不是目录,并且可能不是您想要的,因为它还会跳过符号链接,套接字和其他内容。您可以使用! -type d
,其字面意思不是目录,但是您也可以删除字符和块设备。我建议您查看-type
手册页上的谓词find
。
要使用通配符严格执行此操作,需要高级Shell支持。Bash v4具有globstar
选项,使您可以使用递归匹配子目录**
。zsh
并且ksh
也支持这种模式。使用它,您可以做到rm -rf **/.Apple*
。这不是POSIX标准,也不是非常可移植,因此我避免在脚本中使用它,但是对于一次性交互式shell操作来说,这很好。
-delete
也不是POSIX。**
是zsh
在90年代初期引入的。现在(按出现的时间顺序)还出现在ksh93,鱼,bash和tcsh中。
rm -rf **/.Apple*
-delete
不起作用,请-exec rm -f {} +
改用。
find
删除时您会变得冗长吗?我想“ globstar”方法可以通过添加-v
开关来做到这一点。
我遇到了问题,使用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
mkdir -p $'blah\nDocuments\n/etc\n/home\n/received__output'
如果您不相信可能会丢失数据,请尝试在目录中运行,然后再次运行相同的命令。或者,由于问题是关于Mac OS的,因此mkdir -p $'blah\nDocuments\n/Users\n/Applications\n/received__output'
。(警告:如果这样做,您将删除所有文件。这是我的意思。)
尝试:
shopt -s dotglob # using Bash
printf '%s\n' ./.Apple* # test
#rm -rf ./.Apple*
dotglob
在这里没用。有关dotglob功能的示例,请参见此页面。
find . -type d -name .Apple*
工作了-它列出了所有文件夹。但是,当我最后添加时,它将失败-delete
。它随使用摘要一起返回。它在BusyBox v1.1.1上运行。这有什么区别吗?