有一些操作顺序吗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。对 Dest/执行ls
显示,字母表的两端都有文件和目录(例如AFile.txt
.... .... Zoo.txt
)。
我是否很幸运并rm
在它对我的 Dest/ 目录造成严重破坏之前取消了它?真的那么慢吗rm
(谢天谢地!)?
如果没有,如何rm
递归地删除一些东西,以便我可以猜测可能丢失了什么?
我并不是真的期待恢复我可能失去的东西,只是好奇可能被吹走的东西。
答案1
rm -r
依次处理它的每个参数。如果参数是一个目录,它会列出该目录(带有opendir
和readdir
函数或某些等效方法),并依次对每个条目进行操作。如果条目是目录,它将递归地探索该条目。
这与其他应用程序用于递归遍历目录的方法完全相同 - find
、ls -Rf
等。
遍历的顺序是不可预测的。在大多数文件系统上,只要目录中没有添加、删除或重命名文件,顺序就可以重现(理论上,顺序可以完全随机并且每次都会改变,但我无法想到会发生这种情况的文件系统)。在一些文件系统上,顺序通常可以从文件名或创建文件的顺序或两者的组合推断出来,但您需要了解文件系统的详细信息,并且它可能会有所不同,具体取决于驱动程序版本。遍历的顺序不是你可以依赖的。
请注意,ls
或echo *
按文件名称的字典顺序对文件进行排序。find
并且ls -f
不排序。
您可以信赖的一件事是参数是按顺序处理的。因此,如果C/
仍然部分存在,则意味着Dest/
没有受到影响。如果消失了,您可以通过检查目录修改时间并将其与删除时间或复制结束时间进行比较C/
来了解文件被删除的位置。要删除的第一个文件可能是直接位于层次结构中或位于层次结构深处的文件,具体取决于碰巧遍历的第一个条目是否是目录。Dest/
C/
Dest/
Dest/
rm
速度rm
主要取决于要删除的文件数量。文件非常大才会对删除时间产生明显影响。大部分工作是依次删除每个目录条目。文件的数据不会被删除,删除文件的内容只需将其正在使用的块标记为空闲,相对较快。
答案2
正如 Gilles 所说,您通常无法预测目录中的删除顺序,只能预测顶级目录将按照命令行上的顺序进行处理。
然而,你也可以保证它会从下往上删除目录层次结构,因为 Unix 只允许删除空目录。因此,为了删除目录,首先必须删除其中的所有内容。如果它包含子目录,则必须首先删除其内容,依此类推。