簡潔なバージョン:
私はフラグを使用するときに-f
フラグの動作を取得する方法を探しています。rm
rmdir
長いバージョン:
各コマンドが完了したら、作業ディレクトリをクリーンアップする必要がある並列プロセスを実行しています。同じ作業ディレクトリでコマンドを実行できるため、rmdir -p --ignore-fail-on-non-empty
他の作業者がまだ使用しているディレクトリを作業者が削除するのを防ぐのに適しています。唯一の問題は、同じディレクトリ内の最後の2人の作業者が同時に完了したときに発生するようです。その後、ワーカーの一人が敗北し、rmdir
「該当するファイルまたはディレクトリがありません」というエラーが返されます。
rmdir
withのように問題ではないことを無視する方法はありますか?rm
-f
(rm
実際には別の解決策になるオプションがありますが、型の動作を-d
取得する方法はありません。これはとにかくすべてのバージョンには普遍的ではないので、このアプローチを避けるのが最善です。)-p --ignore-fail-on-non-empty
rm
-d
rm
答え1
まず、ディレクトリが存在することを確認できます。
[ -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"