.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
上記のスクリプトは、最初にファイルをzcat
にtemp
しようとしますが、失敗した場合(ファイルがgzip形式でない場合)はcat
します。これはサブシェルで実行され、実行されたコマンドの出力をキャプチャして、一時ファイル(temp
)にリダイレクトします。次に、temp
の名前が元のファイル名と拡張子(.ext
この例では)、元のファイルは削除されます。
あなたは次のようなことをすることができます
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
次に、現在のディレクトリ内のすべてを削除します。
これにより、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