Rm
rmdir 的 -f 選項
精簡版:
我正在尋找一種方法來獲取使用時
-f
標誌的行為。rm``rmdir
長版:
我正在執行一個並行程序,其中每個命令都必須在完成後清理其工作目錄。命令可以在同一個工作目錄中執行,因此
rmdir -p --ignore-fail-on-non-empty
可以完美地防止工作人員刪除另一個工作人員仍在使用的目錄。當同一目錄中的最後兩個工作人員同時完成時,唯一的問題似乎出現了——然後其中一名工作人員被擊敗並rmdir
返回錯誤“沒有這樣的文件或目錄”。有沒有辦法像
rmdir
忽略這個非問題rm
一樣-f
?(
rm
確實有-d
可能是一個不同的解決方案的選項,但我看不到任何方法來獲得-p --ignore-fail-on-non-empty
類型行為rm
。無論如何,-d
並不是所有版本都通用,rm
所以最好避免這種方法。)
您可以先檢查目錄是否存在:
[ -d "$tmpdir" ] && rmdir -p --ignore-fail-on-non-empty "$tmpdir"
如果兩個作業同時開始刪除目錄,這仍然會產生錯誤(TOCTOU 漏洞:測試和查看目錄,然後都嘗試刪除它),但這可能不太可能。
或者您可以忽略
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"