
複数のフォルダを含むディレクトリがあり、各フォルダには同じ圧縮ファイル名 "spark.log"を持つ複数の.gzファイルが含まれています。すべてのファイルを一度に解凍し、名前をgzファイルに変更するには?
私のデータは次のとおりです
フォルダ一覧
A
B
C
D
それぞれに次のファイルがあります。
A
spark.log.gz
spark.log.1.gz
spark.log.2.gz
spark.log.3.gz
B
spark.log.gz
spark.log.1.gz
spark.log.2.gz
spark.log.3.gz
C
spark.log.gz
spark.log.1.gz
spark.log.2.gz
spark.log.3.gz
D
spark.log.gz
spark.log.1.gz
spark.log.2.gz
spark.log.3.gz
含まれている各gzファイル内で、spark.log
gz名に基づいて解凍して名前を変更できるようにしたいです。例えば:
spark.log.1.gz
->spark.log.1.log
答え1
gzip
元の名前は保存または保存できますが、次のコマンドを実行して名前を表示できますgzip -Nl file.gz
。
$ gzip spark.log
$ mv spark.log.gz spark.log.1.gz
$ gzip -l spark.log.1.gz
compressed uncompressed ratio uncompressed_name
170 292 51.4% spark.log.1
$ gzip -lN spark.log.1.gz
compressed uncompressed ratio uncompressed_name
170 292 51.4% spark.log
gunzip
このオプションを超えないと、解凍されたファイル名としては使用されず、-N
サフィックスが削除されたgzip圧縮ファイル名のみが使用されます.gz
。
zip
圧縮されたアーカイブ形式のInfo-ZIPおよび関連形式のコマンドと混同する可能性がありますがzip
、gzipは単にコンプレッサーです(たとえばcompress
、、、bzip2
... xz
)。
したがって、次のファイルなしでgunzip
呼び出すだけです。-N
gunzip -- */spark.log*.gz
spark.log
、、spark.log.1
...を取得しますspark.log.2
(spark.log.1.log
意味がないか、最後に回転したログファイルではなくサービスのログファイルspark.1.log
として解釈できるという意味ではありません)。spark.1
spark.log
しかし、ログファイルを解凍する理由はほとんどありません。コンテンツを圧縮すると、通常、コンテンツのアクセス速度が速くなります。変更にはコストがかかりますが、通常はログファイルをアーカイブ/回転した後は変更しません。zgrep
、、vim
(そのように設定したzless
場合でも)を使用して内容を確認できます。使用している場合は、最も古いログから最新のログまですべてのログを送信します。less
zcat -f ./*.log*(nOn) | grep...
zsh
grep
答え2
このbash
スクリプトは必要な操作を実行する必要があります。
#! /usr/bin/env bash
for file in ./*/*.gz; do
newfile="${file/%.gz/.log}"
printf 'Extracting %s to %s\n' "$file" "$newfile"
gzip -dc "$file" > "$newfile"
# Use this instead if the .gz file should be deleted
# gzip -dc "$file" > "$newfile" && rm "$file"
done
A
、、、、などのフォルダがあるパスにある必要がありますB
。C
D
この行は、名前がnewfile="${file/%.gz/.log}"
変更されたファイルの新しい名前を指定します(例:Spark.log.1.loggz
ファイルが次の場合は、新しいファイル名でなければなりません。Spark.log.1.gz)現在のファイルの終わりを交換します
。${file/%.gz/.log}
.gz
このprintf
ステートメントは必須ではありませんが、各反復で発生する内容の詳細な出力を表示したい場合に便利です。
リダイレクトと組み合わせて使用すると、抽出されgzip -dc
たファイル名を気にする必要なく動作します。