rm -r 如何进行递归删除?按什么顺序?

N K*_*man 32 recursive rm

是否有一些操作顺序rm?我rm在一个大目录上执行,并且很好奇我应该在哪里查看可能已删除的内容。是否先rm处理文件,然后处理目录?还是基于inode表中的一些信息?

规格:来自 GNU coreutils 8.22 系统的 rm:在 beagleboneblack 文件系统上运行的 Arch Linux 是使用 USB 2.0 的外部 Seagate HDD (ext4)。

背景故事:

我正在执行一些目录清理并执行

cp -r A/ B/ C/ Dest/
Run Code Online (Sandbox Code Playgroud)

不知不觉中,我跟进了

rm -r A/ B/ C/ Dest/
Run Code Online (Sandbox Code Playgroud)

当我想简单地表演时

rm -r A/ B/ C/
Run Code Online (Sandbox Code Playgroud)

我抓住了这个并在不久之后点击了Ctrl+ C。具体来说,当我将time命令与rm&结合使用时,它是 < 3 秒cp。我进去检查,Dest/以为它不存在,但你瞧,它是完整的,似乎没有受到影响。这有点令人惊讶,因为它A/ B/ C/很小。总共可能 100–200 MB。Dest/然而,仅差 1TB。执行lson Dest/ 表明在字母表的两端都有文件和目录(例如AFile.txt.... .... Zoo.txt)。

rm在它对我的 Dest/ 目录造成严重破坏之前,我是否很幸运并取消了它?是rm真的慢(谢天谢地!)?

如果没有,如何rm递归删除东西,以便我可以猜测可能丢失了什么?

我并不是真的期待恢复我可能失去的东西,只是好奇可能被吹走的东西。

Gil*_*il' 36

rm -r依次处理它的每个参数。如果参数是目录,它会列出目录(使用opendirreaddir函数或某种等效方法),并依次对每个条目进行操作。如果条目是目录,它会递归地探索该条目。

这是完全一样的方法,其他应用程序使用遍历目录递归- findls -Rf等等。

遍历的顺序是不可预测的。在大多数文件系统上,只要没有在目录中添加、删除或重命名文件,该顺序就可以重现(理论上该顺序可以完全随机并且每次都改变,但我想不出发生这种情况的文件系统)。在一些文件系统上,通常可以从文件名或文件创建顺序或两者的组合中推断出顺序,但您需要了解文件系统的详细信息,并且可能会有所不同,具体取决于驱动程序版本。遍历的顺序不是您可以依赖的。

请注意lsecho *按名称的字典顺序对文件进行排序。find并且ls -f不排序。

您可以依赖的一件事是参数是按顺序处理的。因此,如果C/仍然部分在那里,则意味着它Dest/没有受到影响。如果C/不见了,您可以Dest/通过检查目录修改时间并将它们与C/删除时间或副本结束时间进行比较来了解文件已被删除的位置。第一个要删除的文件可能是文件直接Dest/或根据第一项是否层次深的地方Dest/rm发生在遍历是一个目录或不。

的速度rm主要取决于要删除的文件数量。需要非常大的文件才能对删除时间产生显着影响。大部分工作是依次删除每个目录条目。文件的数据不会被擦除,擦除文件的内容只需要将它正在使用的块标记为空闲,这是相对较快的。

  • `ls` 的 `-f` 选项被记录为等效于 `-aU`,其中 `-a` 表示列出所有文件,而 `-U` 表示未排序。我依稀记得遇到过一个版本的 `ls`,其中 `-f` 不起作用(我认为它被定义为别的东西)但 `-aU` 起作用了。 (2认同)
  • @G-Man [POSIX](http://pubs.opengroup.org/onlinepubs/009695399/utilities/ls.html) 定义了 `-f`(作为 [XSI 扩展](http://pubs.opengroup.org) /onlinepubs/009695399/help/codes.html#XSI)); 除了 unsorted 之外,它确实还有其他影响。它可以追溯到 V7,所以除了奇怪的 BusyBox 之外,你很难找到没有它的实现。`-U` 只是 unsorted 是一个 GNU 特性,我认为它不存在于其他任何地方。 (2认同)

Bar*_*mar 5

正如吉尔斯所说,您通常无法预测目录中删除的顺序,只能按照命令行上的顺序处理顶级目录。

但是,您还可以保证它会自下而上删除目录层次结构,因为 Unix 只允许删除空目录。因此,要删除目录,首先必须删除其中的所有内容。如果它包含子目录,它必须首先删除它们的内容,依此类推。