如果并行删除,则 rm -rf 失败

Ale*_*x B 4 rm concurrency files

rm -rf如果某些东西试图删除相同的文件树,将会失败(我认为是因为rm首先枚举文件,然后删除)。

一个简单的测试:

# Terminal 1
for i in `seq 1 1000`; do mkdir -p /tmp/dirtest/$i; done

# Now at the same time in terminal 1 and 2
rm -rf /tmp/dirtest
Run Code Online (Sandbox Code Playgroud)

会有一些输出到 stderr,例如:

...
rm: cannot remove directory `/tmp/dirtest/294': No such file or directory
rm: cannot remove directory `/tmp/dirtest/297': No such file or directory
rm: cannot remove directory `/tmp/dirtest/304': No such file or directory
Run Code Online (Sandbox Code Playgroud)

我可以通过将其重定向到 来忽略所有 stderr 输出/dev/null,但删除/tmp/dirtest实际上失败了!两个命令都执行完后,/tmp/dirtest还是在那里。

如何rm正确删除目录树并真正忽略所有错误?

Gil*_*il' 5

可恶的。但从某种意义上说,当两个并发进程正在操作目录树时,您正在寻找麻烦。Unix 为单个文件的原子操作提供了原语,但没有为整个目录树提供原语。

一个简单的解决方法是让您的脚本在删除目录之前重命名目录。由于您的用例具有协作脚本,因此可以预测新名称。

mv /build/tree /build/tree.rm.$$
mkdir /build/tree
rm -rf /build/tree.rm.$$
Run Code Online (Sandbox Code Playgroud)

也许您甚至可以rm稍后在后台执行,而您的构建执行一些 CPU 密集型任务。