【问题标题】:Difference between 'find -delete' and 'rm -rf'?'find -delete' 和 'rm -rf' 的区别?
【发布时间】:2012-07-02 18:39:12
【问题描述】:

我想以递归方式从特定目录中删除文件。所以,我用过

find . -wholename "*.txt" -delete

我们也可以使用删除文件

rm -rf *.txt

使用rmfind删除文件有什么区别??

【问题讨论】:

  • 使用find,您可以更具体地了解要删除的文件,但最终都会对您要删除的文件调用unlink() man page

标签: unix delete-file rm


【解决方案1】:

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' 删除有什么区别呢?
  • 使用find ... 还扫描子目录,而使用rm 仅扫描当前 目录中的文件,而不是子目录中的文件。
  • @MisterJack: -r, rm 也会删除子目录。
  • @reinierpost 我的评论是针对@Aashish P。顺便说一句,-r 用于递归删除文件的内容,如果该文件是一个目录,而不是扫描 also 子目录。
  • @MisterJack:从技术上讲,文件的内容实际上并不在文件所在的目录中(目录只包含文件名和指向文件的指针),所以实际发生的是扫描删除所有内容,类似于find . -depth -exec rm \{} +
【解决方案2】:

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

顺便说一句。你不需要-r 切换到rm 除非你想递归删除一个目录(因为.txt 扩展,我假设你只想删除常规文件)

【讨论】:

    【解决方案3】:

    find-delete 一起使用,查找文件并删除它们。 Find 命令接受路径以查找文件,然后 -delete 标志删除在给定路径中找到的文件。所以,你可以说 find 更像是一个选择性删除

    rm -rf 命令无论如何都会递归删除文件/目录。这意味着rm 将删除所有特定路径下的文件和目录。 -r 代表递归,-f 是强制删除。因此,rm 加上-rf 将继续删除目标路径下目录中的目录和文件,直到找不到更多。

    【讨论】:

      猜你喜欢
      • 2021-04-09
      • 1970-01-01
      • 2014-06-26
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      • 2012-05-13
      相关资源
      最近更新 更多