シェルスクリプトによるサイズチェックとファイルの削除

シェルスクリプトによるサイズチェックとファイルの削除

さて、デフォルトではMySQLからデータをインポートしてCSVファイルとして保存し、sftpを使用してすべてのファイルを別のサーバーにプッシュするこのようなスクリプトを作成しました。

だから、基本的にファイルに内容があるかどうかを確認するこのようなスクリプトを作成したいと思います。ファイルに内容がない場合は、デフォルトでログに「ファイルに内容がありません」と記録して削除し、ログに「ファイルの削除」を追加します。

ありがとうとよろしくお願いします、サガール

ベストアンサー1

現在のディレクトリとその下のディレクトリで空のファイルを見つけ、そのパスを次のテキストファイルに書き込むとしますempty.txt

find . ! -path ./empty.txt -type f -empty -print -delete >empty.txt

findこれは、非標準-emptyとオプションを理解する実装があると仮定します-delete。このコマンドはempty.txtログインしているファイルを削除しません。それ以外の場合は、そのempty.txtファイルのパス名を出力している間に空の一般ファイルを見つけて削除します。

何もせずに上記のコマンドを実行すると、-print何が削除されるのかを確認できます。

標準コンプライアンスバリエーションの場合:

find . ! -path ./empty.txt -type f -exec sh -c '
    for pathname do
        if [ ! -s "$pathname" ]; then
            printf "%s\n" "$pathname"
            rm -f "$pathname"
        fi
    done' sh {} + >empty.txt

これは、見つかったファイルのバッチの短いインラインシェルスクリプトを呼び出します。スクリプトは-stestを使用して各パス名をテストして空であることを確認します-s本物空でない場合(これがテストを無効にする理由です)、ファイルのパス名を印刷してくださいrm -f

以前と同様に、この出力はempty.txt

短くても効率が低い標準バージョンは次のとおりです。

find . ! -path ./empty.txt -type f \
    ! -exec test -s {} \; -print -exec rm -f {} + >empty.txt

testこれはファイルごとに1回ずつ外部コマンドを実行するため、効率が悪くなります。

おすすめ記事