コンテンツに圧縮されていないファイルが二重gzipで誤って圧縮されました。

コンテンツに圧縮されていないファイルが二重gzipで誤って圧縮されました。

誤って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、それ以外の場合は一時ファイルを削除します。

関連情報