rm -rf 如果中间删除不了,还会继续删除吗?

rm -rf 如果中间删除不了,还会继续删除吗?

考虑一个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尝试触发getdentsI/O 等待不间断睡眠的目录,rm将等待该等待的解决方案以继续。

也就是说,如果rm无法完成unlinkat,异常情况将根据具体情况进行处理。例如,如果unlinkat由于文件丢失而失败,rm则会继续,但会报告ENOENT( No such file or directory)。

相关内容