Answers:
-delete
会更好地执行,因为它不必为每个匹配的文件生成外部进程。
您可能会-exec rm {} \;
经常看到推荐的内容,因为-delete
并非所有版本的都存在find
。我现在无法检查,但是我敢肯定我已经find
没有了。
两种方法都应该是“安全的”。
编辑来自@doitmyway的每个注释:确保名称匹配,然后删除,而不是相反(删除,然后匹配)。否则,无论是否匹配,每个文件都将被删除。即,请勿这样做:find / -delete -name .DS_Store
。
避免为每个匹配文件生成外部进程的开销的常用方法是:
find / -name .DS_Store -print0 | xargs -0 rm
(但请注意,这里也存在可移植性问题:并非所有版本的find都具有-print0
!)
find
您可以使用-exec rm {} +
单个rm
命令删除所有匹配的文件。
.DS_Store
根本不包含任何特殊字符,因此引号是不必要的,在这种情况下不做任何更改。
;
or |
或>
or <
和``以及许多其他对外壳具有特殊含义的字符,除非引用)
xargs
通过将其分解为命令的多个调用来透明地处理有限大小的参数列表问题。
对于诸如Macbook之类的机器,这两个命令之间的性能差异不会太大。但是,如果查看-exec版本,则可以看到细微的差别:
sudo find / -iname ".file-to-delete" -exec rm {} \;
这意味着您将找到所有名称为“ .file-to-delete”的文件。但是,此搜索可能会返回一些不需要的误报。使用sudo做某事时,您应该多加注意。使用-exec rm {}的好处是您可以像这样将参数传递给rm:
sudo find / -iname "*~" -exec rm -i {} \;
在此示例中,我想删除emacs创建的那些备份文件。但是,代字号可能存在于一些我不知道的模糊文件中,这可能很重要。另外,我要确认删除。因此,我将选项“ -i”放在rm命令上。这将给我一个交互式删除。
您还可以优化rm的用法以删除目录和文件:
find /usr/local/share/ -iname "useless" -exec rm -r {} \;
简而言之,-exec使您对删除已找到项目的实际命令有更多控制。好处是您可以使用一种工具查找文件,而使用另一种工具删除文件。同样,并不是每个版本的find实用程序都具有-delete选项。因此最好使用每种工具来完成其适当的工作。这是Unix的理念-一种工具,一项工作,将它们一起使用以完成您需要做的事情。
-ok rm {} \;
代替以-exec rm {} \;
进行交互式确认。
-delete
在-name
删除指定的文件树之前使用开关,所以我想我必须要小心。