エラーなしでLinuxで複数のファイル削除をキャプチャする方法は?

エラーなしでLinuxで複数のファイル削除をキャプチャする方法は?

ディレクトリ/ファイルを削除するには、次のコマンドを使用しています。私が知っている限り、ディレクトリ/ファイルにアクセス権がある場合、または他の問題がある場合は、その項目をスキップして残りのファイルを削除します。

find $CDIR -mtime +7 -exec rm -rfv {} \;

RETURN_CODE_CLEANUP=$?

さて、バッチ削除時にエラーがどれだけ発生するかを確認したいと思います。私はRETURN_CODE_CLANUP1つ以上のエラーに対してゼロではないと思います。この方法でエラーをキャッチできますか?

ベストアンサー1

生成されたエラーの正確な数を計算するには、次のようにしますrm

find "$CDIR" -depth -mtime +7 -exec sh -c '
    for pathname do
        if ! rm -rfv "$pathname"; then
           count=$(( count + 1 ))
        fi
    done
    printf "This batch caused %d errors in rm\n" "$count"' sh {} +

$CDIRこれにより、サブディレクトリの深さ優先検索が実行され、変更タイムスタンプが1週間以上古いすべてのファイルまたはディレクトリが削除されます。インラインシェルスクリプトが呼び出され、一括してパス名を探し、各パス名を繰り返し削除が失敗した場合にrm計算されます。埋め込みスクリプトが終了すると、バッチの失敗回数が報告されます。

これは非常に危険な清掃方法ですのでご注意ください。1週間以内にファイルまたはディレクトリ自体が追加または削除されない場合、ルートと見なされるディレクトリ構造全体が削除され$CDIRます。$CDIR。のすべてのサブディレクトリに同じ問題があります$CDIR

古いものを削除したい場合があります文書、削除各ディレクトリ:

find "$CDIR" ! -type d -mtime +7 -exec sh -c '
    for pathname do
        if ! rm -fv "$pathname"; then
           count=$(( count + 1 ))
        fi
    done
    printf "%d files in this batch could not be deleted\n" "$count"' sh {} +

find "$CDIR" -type d -empty -delete

(これは、最初のコマンドで空でない場合でも空のディレクトリを削除でき、サポートする実装があるとfind仮定-emptyします。)-deletefind

いつものように、このタイプのクリーンアップを実行するコマンドをテストするときは、次のようにします。コピーデータをバックアップしてデータをバックアップします。


別の(より簡単な)アプローチは、単に古いファイルを削除してから、まだ存在する古いファイルの数を数えることです。数字は失敗の数ですrm(単純化のためにここでは使用されます-delete)。

find "$CDIR" ! -type d -mtime +7 -delete
find "$CDIR" ! -type d -mtime +7 -exec echo x \; | wc -l

その後、上記のように空のディレクトリを整理することもできます。

おすすめ記事