“find -delete”和“rm -rf”的区别是什么?

13

我想递归地从特定目录中删除文件。所以,我使用了

find . -wholename "*.txt" -delete

我们也可以使用以下方式删除文件:

rm -rf *.txt

rmfind 删除文件的区别是什么?


3
使用 find 命令可以更加精确地选择要删除的文件,但两者最终都会调用 unlink() 函数 man 手册 删除指定的文件。 - Wernsey
3个回答

9
find . -name abd.txt -delete 尝试删除在目录树中任意位置命名为 abd.txt 的所有文件。 find . -wholename abd.txt -delete 尝试删除在目录树中完整路径名为 abd.txt 的所有文件。
这样的文件将永远不存在:当使用 find . 时,找到的所有文件的完整路径名都以 ./ 开头,因此即使当前目录中存在名为 abd.txt 的文件,它的路径也是 ./abd.txt,并且不匹配。 find . -wholename ./abd.txt -delete 将会删除当前目录中名为 abd.txt 的文件。 find -wholename ./abd.txt -delete 同样可以做到这一点。
如果 abd.txt 是一个非空目录,则删除操作将失败。
(我刚刚使用 GNU find 4.6.0 进行了上述尝试;其他版本可能会有不同的行为。) rm -rf abd.txt 也尝试删除当前目录中的 abd.txt,如果它是一个非空目录,则会将其及其中的所有内容全部删除。
要使用 find 实现这个功能,您可以使用以下命令: find . -depth \( -wholename ./abd.txt -o -wholename ./abd.txt/\* \) -delete

好的。那么使用“find -delete”和“rm -rf”进行删除有什么区别? - Aashish P
1
使用 find ... 命令可以扫描子目录,而使用 rm 命令只能扫描当前目录中的文件,不能扫描子目录。 - Alessandro Vendruscolo
@MisterJack:使用“-r”选项,rm 命令也会删除子目录。 - reinierpost
@reinierpost 我的评论是给 @Aashish P 的。顺便说一下,-r 用于递归删除文件的内容,如果该文件是一个目录,则会删除其子目录中的内容。 - Alessandro Vendruscolo
@MisterJack:在技术上讲,一个文件的内容并不实际存在于包含该文件的目录内(目录仅包含文件名和指向文件的指针),所以实际发生的是扫描以删除所有内容,类似于“find . -depth -exec rm {} +”。 - reinierpost
我刚重写并扩展了这个答案;以前的版本忽略了-name-wholename之间的差异 :-( - reinierpost

3

虽然 find -wholename GLOBPATTERN 尝试匹配当前目录下的每个文件(与深度无关),但您在 rm 命令中使用的 glob 仅针对当前目录下直接(深度为1)的文件进行匹配。

顺便提一下,除非您想递归删除目录(由于扩展名为.txt,我假设您只想删除常规文件),否则不需要使用 -r 开关来执行 rm 命令。


2
find-delete 结合使用,可以查找并删除文件。 find 命令需要输入要查找文件的路径,然后使用 -delete 标志删除在该路径下找到的文件。因此,我们可以说 find 更像是一种选择性删除。
相比之下,rm -rf 命令会递归地删除所有文件/目录,而不管它们是什么。这意味着 rm 将删除指定路径下的所有文件和目录。其中,-r 表示递归,-f 表示强制删除。因此,将 rm-rf 结合使用时,它会继续删除目标路径中的目录和目录中的文件,直到没有更多的文件为止。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接