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