我有一个目录,其中有多个文件夹,每个文件夹包含多个具有相同压缩文件名“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
的路径中...C
D
该行:newfile="${file/%.gz/.log}"
指定将重命名的文件的新名称(例如Spark.log.1.loggz
如果文件是,则应为新文件名火花.log.1.gz)
我${file/%.gz/.log}
将替换.gz
当前文件末尾的 。
该printf
语句不是必需的,但如果您想查看有关每次迭代中发生的情况的详细输出,该语句可能会很有用。
与重定向一起使用gzip -dc
意味着这将起作用,而不必担心提取的文件的名称。