gzipを使用すると、スクリプトに予期しないファイルの終わりが表示されるのはなぜですか?

gzipを使用すると、スクリプトに予期しないファイルの終わりが表示されるのはなぜですか?

これについて質問があります。

for i in ./*.gz
do
gunzip -c $i | head -8000 | gzip > $(basename $i)
done

gzipを使用すると、「予期しないファイルの終わり」エラーが発生し、8000はまったく表示されず、数十行しか表示されません。ファイルの整合性を確認しましたが、すべてが正常です。奇妙なことは、単一のファイルを実行すると次のようになることです。

gunzip -c file1.gz | head -8000 | gzip > file1.gz

予想した結果を得ました。このスクリプトを使用すると、10708712行を含む圧縮ファイルから最初の8000行を取得して再圧縮できます。新しいファイルは元のファイルを上書きしますが、大丈夫です。

ベストアンサー1

出力を一時ファイルに書き込んでから名前を変更する必要があります。

for i in ./*.gz 
do 
  gunzip -c "$i" | head -8000 | gzip > "$i.tmp"
  mv -f "$i.tmp" $(basename "$i") 
done

gunzip読み込み中に十分にバッファリングすると、あなたのバージョンが動作することがあります。

おすすめ記事