空のgzファイルをチェックするUnix bashスクリプト

空のgzファイルをチェックするUnix bashスクリプト

.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

-lgzip圧縮ファイルの印刷情報を追加してから、圧縮されて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削除できます。

関連情報