rmdir 的 -f 选项

rmdir 的 -f 选项

简洁版本:

我正在寻找一种在使用时获取-f标志行为的方法。rmrmdir

长版:

我正在运行一个并行进程,其中每个命令都必须在完成后清理其工作目录。命令可以在同一工作目录中运行,因此rmdir -p --ignore-fail-on-non-empty可以完美地防止工作人员删除另一个工作人员仍在使用的目录。当同一目录中的最后两个工作人员同时完成时,似乎会出现唯一的问题 - 然后其中一个工作人员被击败并rmdir返回错误“没有这样的文件或目录”。

有没有办法像withrmdir一样忽略这个非问题?rm-f

rm确实有-d可能是不同解决方案的选项,但我看不到任何方法来获取 的-p --ignore-fail-on-non-empty类型行为rm。无论如何,-d这对于所有版本都不是通用的,rm所以最好避免这种方法。)

答案1

您可以先检查该目录是否存在:

[ -d "$tmpdir" ] && rmdir -p --ignore-fail-on-non-empty "$tmpdir" 

如果两个作业完全同时开始删除目录(aTOCTOU漏洞:都测试并查看该目录,然后都尝试删除它),但这可能不太可能。

或者您可以忽略rmdir可能产生的每个错误:

rmdir -p --ignore-fail-on-non-empty "$tmpdir" 2>/dev/null || true

或者,创建您自己的程序来删除该目录,但仅忽略“文件不存在”错误。例如,使用 Perl:

perl -le 'if (not rmdir($ARGV[0]) and not $!{ENOENT}) { 
       warn "rmdir: $!\n"; exit 1; }' "$tmpdir"

相关内容