web-dev-qa-db-ja.com

gz拡張子なしでgzipファイルを一括解凍

.0_1234.0_4213.0_4132などの拡張子を持つファイルが大量にあります。これらの一部はgzip圧縮されており、一部は生の電子メールです。圧縮ファイルを特定し、それらを解凍し、すべての圧縮ファイルが解凍されたら、すべてのファイルの名前を共通の拡張子に変更する必要があります。 fileコマンドを使用して圧縮されているものを判別し、結果をgrepし、sedを使用して出力をファイルのリストに絞り込むことができることがわかりましたが、一見ランダムに見える解凍方法を判別できません。拡張機能。これが私がこれまでに持っているものです

file *|grep gzip| sed -e 's/: .*$//g'

xargsなどを使用して、出力で提供されるファイルのリストを取得し、それらの名前を.gzに変更して解凍できるようにするか、単にインラインで解凍します。

gzipを使用せず、代わりにzcatを使用してください。すべてを一度に行うことができます。ファイルをzcatしてみてください。圧縮されていないために失敗した場合は、代わりにcatしてください。

for f in *; do 
    ( zcat "$f" || cat "$f" ) > temp && 
    mv temp "$f".ext && 
    rm "$f" 
done

上記のスクリプトは、最初にファイルをzcattempしようとしますが、失敗した場合(ファイルがgzip形式でない場合)はcatします。これはサブシェルで実行され、実行されたコマンドの出力をキャプチャして、一時ファイル(temp)にリダイレクトします。次に、tempの名前が元のファイル名と拡張子(.extこの例では)、元のファイルは削除されます。

5
terdon

あなたは次のようなことをすることができます

for f in ./*
do 
gzip -cdfq "$f" > "${f}".some_ext
done

これにより、すべてのファイル(-fを介して非圧縮ファイルも含む)が処理され、(-cを介して)出力がstdoutに書き込まれ、リダイレクトを使用して各ファイルのコンテンツが対応する.some_extに保存されます。その後、オリジナルを削除できます。 bash

shopt extglob
rm -f ./!(*.some_ext)

またはzsh

setopt extendedglob
rm -f ./^*some_ext

結果のファイルを別のディレクトリに保存することもできます(今回は元の拡張子を削除することを前提としています)。

for f in *
do 
gzip -cdfq -- "$f" > /some/place/else/"${f%.*}".some_ext
done

次に、現在のディレクトリ内のすべてを削除します。

4
don_crissti

これにより、gzipで圧縮されたすべてのファイルのリストが表示されます。

file /path/to/files | grep ': gzip compressed data' | cut -d: -f1

Gzipで圧縮されたファイルに.gz拡張子を付けるために、この醜いハックは次のことを行う可能性があります。

for file in ./*; do
    if gzip -l "$file" > /dev/null 2>&1; then
        case "$file" in
          *.gz) :;; # The file already has the extension corresponding to its format
          *) mv "$file" "${file}.gz";;
        esac
        # Uncomment the following line to decompress them at the same time
        # gunzip "${file}.gz"
    fi
done
3
DopeGhoti