gunzip 多个文件夹中具有相同压缩文件名的多个 gz 文件

gunzip 多个文件夹中具有相同压缩文件名的多个 gz 文件

我有一个目录,其中有多个文件夹,每个文件夹包含多个具有相同压缩文件名“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

您可能会将它与 Info-ZIP 的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的路径中...CD

该行:newfile="${file/%.gz/.log}"指定将重命名的文件的新名称(例如Spark.log.1.loggz如果文件是,则应为新文件名火花.log.1.gz
${file/%.gz/.log}将替换.gz当前文件末尾的 。

printf语句不是必需的,但如果您想查看有关每次迭代中发生的情况的详细输出,该语句可能会很有用。

与重定向一起使用gzip -dc意味着这将起作用,而不必担心提取的文件的名称。

相关内容