.gzファイルのディレクトリを繰り返しながらファイルが空の場合は、削除するbashスクリプトを作成しようとしています(たとえば、空中に含まれる非圧縮ファイル)。
いくつかの質問があります。
- 確認できる圧縮(gz)空のファイルの標準ファイルサイズはありますか?
- それとも、bashスクリプトを使用して解凍せずにgzに空のファイルが含まれていることを確認するより良い方法はありますか?
これを達成するには、次のコードを使用しようとしていますが、ファイルサイズが0でなければならないと思います。
for f in dir/*
do
if [[ -s $f ]]
then
do_file_creation
fi
done
答え1
残念ながら、gzipには元のファイル名が含まれているため、空のファイルによってサイズが異なります。
gunzip -c $f | head -c1 | wc -c
圧縮されていないサイズがゼロ以外のファイルの場合は1を、圧縮された空のファイルの場合は0を表示します。
for f in dir/*
do
if [[ $(gunzip -c $f | head -c1 | wc -c) == "0" ]]
then
do_file_creation
fi
done
あなたが望むことができますか?
答え2
-l
gzip圧縮ファイルの印刷情報を追加してから、圧縮されてgzip|gunzip|zcat
いないファイルのサイズをテストできます。
$ gunzip -l file.empty.gz
compressed uncompressed ratio uncompressed_name
31 0 0.0% file.empty
答え3
ファイル名(または圧縮ファイルに名前がない場合)によってファイルサイズが変更されるため、標準サイズが見つかりません。
$ touch file1 file2-longer-name file3
$ gzip file1 file2-longer-name
$ gzip --no-name file3
$ ls -l file*.gz
-rw-r--r-- 1 cwarden cwarden 26 May 29 10:33 file1.gz
-rw-r--r-- 1 cwarden cwarden 38 May 29 10:33 file2-longer-name.gz
-rw-r--r-- 1 cwarden cwarden 20 May 29 10:33 file3.gz
私は次のようにすることができます:
for f in dir/*; do
zcat $f | head -1 | ifne -n rm -f $f > /dev/null
done
答え4
for i in *.gz
do
[ `zcat "$i" | head -n 1 | wc -c ` -eq 0 ] && rm -i "$i"
done
ファイルの最初の行にある文字数が計算されるため、zcat "$i" | head -n 1 | wc -c
ファイルの先頭のみを表示してファイル全体の解凍を防ぐことができます。
-i
ファイルを削除する前に確認を要求するコマンドに1つを追加しましたが、必要に応じてrm
削除できます。