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上运行。这有什么区别吗?