考虑一个garbage
包含许多文件和目录的目录。如果我运行rm -rf garbage
,但其中的某些文件或目录garbage
正被操作系统/NFS/等占用,因此rm -rf
它们将会失败。剩下的会删掉吗?或者它会在第一次失败时停止删除吗?当前的操作系统是 Ubuntu 20.04,但人们感兴趣的是这种行为是标准的,还是取决于操作系统(版本)。
答案1
rm
的行为POSIX 中有详细规定(也可以看看在非常大的文件夹上执行 rm -Rf 期间的实际步骤顺序是什么?它再现了完整的序列)。在无法删除当前文件或该文件不存在的所有情况下,它必须
继续处理任何剩余的文件
这意味着即使在失败的情况下,它也会继续删除文件(如果可以的话)。这既适用于指定为 的参数的文件rm -rf
,也适用于处理目录时找到的文件。
请注意,在某些情况下,它将永久等待操作的结果(例如如果它尝试删除服务器没有响应的 NFS 挂载上的文件);它将最终进入不间断睡眠(状态D
),但如果该状态解决,它将继续删除文件。实际上从来没有停止删除,直到用完要删除的文件。
答案2
rm -r
本质上取消链接“文件”条目,无论它们是文件、目录、符号链接等(例如,使用unlinkat
),首先迭代遇到的任何目录(例如,使用getdents
)。在任何时候都不会rm
尝试打开、读取或写入它遇到的文件。也就是说,如果rm
尝试触发getdents
I/O 等待不间断睡眠的目录,rm
将等待该等待的解决方案以继续。
也就是说,如果rm
无法完成unlinkat
,异常情况将根据具体情况进行处理。例如,如果unlinkat
由于文件丢失而失败,rm
则会继续,但会报告ENOENT
( No such file or directory
)。