我试图了解这两个命令之间的区别:
sudo find / -name .DS_Store -delete


sudo find / -name ".DS_Store" -exec rm {} \;

我注意到-exec ... {}方法是首选的。为什么?哪一个更安全/更快/更好?我已经在Macbook上用过,而且一切似乎都正常工作。

#1 楼

-delete的性能更好,因为它不必为每个匹配的文件生成外部进程。

您可能会经常看到-exec rm {} \;,因为-delete在所有版本的find中都不存在。我现在无法检查,但是我很确定我没有使用过find。 @doitmyway:确保您在名称上匹配,然后删除,而不是相反(删除,然后匹配)。否则,无论是否匹配,每个文件都会被删除。即,请勿执行以下操作:find / -delete -name .DS_Store

避免为每个匹配文件生成外部进程的开销的常用方法是:

find / -name .DS_Store -print0 | xargs -0 rm


(但请注意,这里也存在可移植性问题:并非所有版本的find都具有-print0!)

评论


我懂了。我还读到在-name删除指定的文件树之前使用-delete开关,所以我想我必须要小心。

–洋葱
2014年11月13日18:56



在最近的发现中,您可以使用-exec rm {} +通过单个rm命令删除所有匹配的文件。

– jimmij
2014年11月13日在18:59

.DS_Store根本不包含任何特殊字符,因此引号是不必要的,在这种情况下不做任何更改。

–塞拉达
2014年11月13日在19:09

基本上,只有空格(空格,制表符,可能还有其他空格)是导致未加引号的字符串被解释为两个单独的命令行参数的唯一原因,但这并不是您在决定是否引用时所要担心的全部。您必须担心所有壳元字符,例如;或|或>或<和``以及许多其他对shell具有特殊含义的对象(除非引用)。

–塞拉达
2014年11月13日在21:41

@MarcoMarsala xargs通过将其分解为命令的多个调用来透明地处理有限大小的参数列表问题。

–塞拉达
15-10-22在19:36

#2 楼

假设.DS_Store代表文件而不是目录,最容易实现的快速方法是:

sudo选项用于要求GNU查找,并且在许多其他-delete实现中仍非标准,因此并不总是可用。

命令终止find代替+的高度通过不为文件系统上存在的每个\;运行exec命令来高度优化rm子句。

#3 楼

对于Macbook之类的机器,这两个命令之间的性能差异不会太大。但是,如果您查看-exec版本,则可以看到细微的差别:

sudo find / -iname ".file-to-delete"  -exec rm {} \;


这意味着您将找到所有名称为“ .file-to”的文件-删除”。但是,此搜索可能会返回一些不需要的误报。使用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 {} \;进行交互式确认。

– Kusalananda♦
18年6月27日在9:44