複数のフォルダに同じzipファイル名を持つ複数のgzファイルをgunzipに圧縮する

複数のフォルダに同じzipファイル名を持つ複数のgzファイルをgunzipに圧縮する

複数のフォルダを含むディレクトリがあり、各フォルダには同じ圧縮ファイル名 "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.loggz名に基づいて解凍して名前を変更できるようにしたいです。例えば: 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.2spark.log.1.log意味がないか、最後に回転したログファイルではなくサービスのログファイルspark.1.logとして解釈できるという意味ではありません)。spark.1spark.log

しかし、ログファイルを解凍する理由はほとんどありません。コンテンツを圧縮すると、通常、コンテンツのアクセス速度が速くなります。変更にはコストがかかりますが、通常はログファイルをアーカイブ/回転した後は変更しません。zgrep、、vim(そのように設定したzless場合でも)を使用して内容を確認できます。使用している場合は、最も古いログから最新のログまですべてのログを送信します。lesszcat -f ./*.log*(nOn) | grep...zshgrep

答え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、、、、などのフォルダがあるパスにある必要がありますBCD

この行は、名前がnewfile="${file/%.gz/.log}"変更されたファイルの新しい名前を指定します(例:Spark.log.1.loggzファイルが次の場合は、新しいファイル名でなければなりません。Spark.log.1.gz)現在のファイルの終わりを交換します
${file/%.gz/.log}.gz

このprintfステートメントは必須ではありませんが、各反復で発生する内容の詳細な出力を表示したい場合に便利です。

リダイレクトと組み合わせて使用​​すると、抽出されgzip -dcたファイル名を気にする必要なく動作します。

関連情報