rm -r如何递归删除?以什么顺序?


30

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

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

背景故事:

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

cp -r A/ B/ C/ Dest/

不知不觉中,我跟进了

rm -r A/ B/ C/ Dest/

当我只想表演

rm -r A/ B/ C/

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

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

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

我并不是真的希望能恢复我可能丢失的东西,只是对可能被吹走的东西感到好奇。


Answers:


34

rm -r依次处理其每个参数。如果参数是目录,它将列出目录(使用opendirreaddir函数或某些等效方法),并依次对每个条目进行操作。如果条目是目录,它将以递归方式浏览该条目。

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

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

请注意,lsecho *按照文件名的先后顺序对其进行排序。find并且ls -f不排序。

您可以依靠的一件事是参数是按顺序处理的。因此,如果C/仍在那儿,那就意味着它Dest/没有被触及。如果C/已消失,则可以Dest/通过检查目录修改时间并将它们与C/删除时间或复制结束时间进行比较,从而了解文件从何处删除。要删除的第一个文件可以是直接在Dest/层次结构中或层次结构中某个深处的文件,具体取决于该文件Dest/rm碰巧遍历的第一个条目是否是目录。

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


2
文档中的-f选项ls等效于-aU,其中-a表示列出所有文件,-U表示未排序。我依稀记得遇到一个版本ls-f并没有工作(我认为它被定义为别的东西),但-aU没有。
G-Man说'Resstate Monica''14

2
@ G-Man POSIX定义-f(作为XSI扩展名);实际上,它确实具有除未排序以外的其他影响。它可以追溯到V7,因此除了BusyBox之外,如果没有它,很难找到一个实现。-U因为只是未分类的是GNU功能,所以我认为它不存在于其他任何地方。
吉尔斯(Gillles)“所以-别再作恶了”


@Tim号。您可以通过ls -U在目录中运行进行测试。这与rm -r该目录中的工作顺序相同。请注意,添加或删除文件可以更改其他文件的顺序。
吉尔斯(Gilles)'所以

谢谢。(1)“添加或删除文件可能会更改其他文件的顺序。”,因此,在意外部分删除之后,ls -U是否仍无法找到尚存的目录?(2)-U表示“按目录顺序列出条目”。-U是否表示目录中目录条目的顺序?
2015年

5

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

但是,您还可以保证从下至上删除目录层次结构,因为Unix仅允许在目录为空的情况下将其删除。因此,要删除目录,它首先必须删除其中的所有内容。如果包含子目录,则必须先删除其内容,依此类推。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.