简洁版本:
我正在寻找一种在使用时获取-f
标志行为的方法。rm
rmdir
长版:
我正在运行一个并行进程,其中每个命令都必须在完成后清理其工作目录。命令可以在同一工作目录中运行,因此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"