所以我可能有点意外地 rm -r'd ~。不用担心,我有备份!我快速地做了一个文件列表差异来复制已删除的文件,一切都很好。但是...
如果我中断 GNU rm,它会损坏文件吗?它肯定只是每秒解除几 GB 的宝贵数据链接,而不是从磁盘本身删除文件?
答案1
不。 rm
只需调用unlink()
以删除名称。此系统调用是原子的,这意味着它要么成功删除名称,要么失败。它不能被中断。如果在 rm 正在处理unlink()
多个文件时中断它,则某些文件将被成功删除,而有些则不会。如果所有链接都已删除,则释放文件正在使用的块等日常管理是一项单独的操作,可以稍后完成,如果此操作被中断(由于电源故障或系统崩溃,而不是中断rm
),文件系统可能需要fsck
完成它,但现在大多数文件系统都是日志式的,因此它们不需要这个。无论哪种方式,文件要么被删除,要么不被删除,没有中间状态。
答案2
从维基百科
更准确地说,rm 从文件系统中删除对对象的引用,这些对象可能有多个引用(例如,具有两个不同名称的文件),并且仅当所有引用都被删除并且没有程序仍然拥有对这些对象的打开句柄时,对象本身才会被丢弃。
是的,您的取消链接类比非常好。如果您有多个指向文件的硬链接,则数据将不会被标记为可丢弃,直到所有链接都消失(符号链接不符合条件,只有硬链接才符合条件)。
如果您有备份,最好对备份和主目录执行一些 md5 或 sha1 哈希运算,并对它们进行差异分析以发现任何更改,但只要您恢复了丢失的文件,残留的文件就不会受到任何损坏。
一如往常,YMMV。