誤って2回圧縮されたファイルがあります。ファイル拡張子なし
たとえば、gzip -dc file
いくつかのファイルはいくつかのバイナリ横説説を出力しますが、他のファイルは問題ありません。
フォルダ内の二重gzip圧縮ファイルを見つけて(すべてのファイルが二重gzipで圧縮されているわけではありませんが、すべてのファイルが少なくとも一度はあります)、自動的に単一のgzip圧縮状態に復元できるコマンドを実行したいと思います。
答え1
次のことができます。
for file in *; do
zcat -- "$file" |
file - |
grep -wq compressed &&
gunzip -- "$file"
done
これには任意のファイル名で実行できるという利点があります。あなたの方法としてls
、参照http://mywiki.wooledge.org/ParsingLs)もはるかにシンプルに見えます。少なくとも私にとってはそうだ。
.gz
欠点は、拡張子のないgzipファイルで終わることができることです。しかし、これは簡単に解決されます:
for file in *; do
case "$file" in
*.gz) ;;
*) file -- "$file" |
grep -wq compressed &&
mv -v -- "$file" "$file".gz;;
esac
done
答え2
これは私が使用するコマンドです:
ls | xargs -L1 -I[] sh -c 'basename "[]" | xargs -L1 -I{} sh -c "cp -a \"[]\" \"/tmp/{}.gz\" && gzip -d \"/tmp/{}.gz\" && file \"/tmp/{}\" | (grep compressed -q && rsync -a \"/tmp/{}\" \"[]\" --remove-source-files) || rm \"/tmp/{}\""'
デフォルトでは、ファイルをコピーして/tmp/
解凍し、新しいファイルがまだ圧縮されていることを確認し(file some_file | grep compressed -q
)、そうであれば元の場所( )に戻りrsync source dest --remove-source-files
、それ以外の場合は一時ファイルを削除します。