我有一个目录,其中有多个文件夹,每个文件夹包含多个具有相同压缩文件名“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
While
gzip
确实或可以存储原始名称,您可以通过运行来显示gzip -Nl file.gz
:gunzip
除非您传递该-N
选项,否则不会将其用作未压缩文件的名称,并且只会使用已.gz
删除后缀的 gzip 压缩文件的名称。您可能会将它与 Info-ZIP 的
zip
命令及其相关zip
格式混淆,后者是一种压缩存档格式,而 gzip 只是一个压缩器,如compress
,bzip2
,xz
...所以你只需要在
gunzip
没有-N
这些文件的情况下调用:你会得到
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
等。这个
bash
脚本应该做你想做的事:你必须在你有你的文件夹的路径
A
中B
,,,,,C
等等D
......该行:
newfile="${file/%.gz/.log}"
分配将被重命名的文件的新名称(例如spark.log.1.log应该是新文件名,如果gz
文件是spark.log.1.gz)我将替换末尾的当前文件。
${file/%.gz/.log}
.gz
该
printf
语句不是必需的,但如果您想查看有关每次迭代中发生的情况的详细输出,该语句可能很有用。与重定向一起使用
gzip -dc
意味着这将起作用,而不必担心提取文件的名称。