さて、デフォルトでは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
これは、見つかったファイルのバッチの短いインラインシェルスクリプトを呼び出します。スクリプトは-s
testを使用して各パス名をテストして空であることを確認します-s
。本物空でない場合(これがテストを無効にする理由です)、ファイルのパス名を印刷してくださいrm -f
。
以前と同様に、この出力はempty.txt
。
短くても効率が低い標準バージョンは次のとおりです。
find . ! -path ./empty.txt -type f \
! -exec test -s {} \; -print -exec rm -f {} + >empty.txt
test
これはファイルごとに1回ずつ外部コマンドを実行するため、効率が悪くなります。
答え2
コマンドはwc -l
ファイルの行数を計算します。これはビルディングブロックにすることができます。
lineCount=$(<$fileName wc -l)
if [ $lineCount -eq 0 ]; then
echo "File $fileName has no content"
fi