从 bash 中的多个文件中删除扩展名中的附加 .tar.gz

Removing additional .tar.gz in the extension from several files in bash

我有一个bash脚本负责每天移动和压缩目录下的一些旧日志文件。

做一些测试我注意到脚本一次又一次地递归压缩每个压缩文件,所以现在我有一堆文件名如下:$files.log(.tar.gz * N天)。

是否可以从所有这些文件中删除所有额外的 .tar.gz?

您可以使用如下简单的内联命令:

for old in *.tar.gz; do mv $old ${old%%.tar*}.tar.gz; done

这将找到由 .tar.gz

完成的每个文件

${old%%.tar*} 将获取所有文件名和扩展名,直到找到第一个 '.tar'。

然后我们再次添加.tar.gz,我们就完成了工作。

希望对您有所帮助。

Even if you will remove the extra .tar.gz extension from the file, it won't be useful check the below example -

Compress : 
ls -ltr file1
tar -cvzf file1.tar.gz file1
tar -cvzf file1.tar.gz.tar.gz file1.tar.gz

Rename :

mv -f file1.tar.gz.tar.gz file1.tar.gz

Uncompress :

tar -xvf file1.tar.gz.tar.gz
generated file : file1.tar.gz

means file1.tar.gz(which is in actual .tar.gz.tar.gz) generated file1.tar.gz so you have to again uncompress the file.

In order to avoid this - you need to make changes in your script. while selecting the file for compression you should avoid the already compressed files using below cmd

find . -type f -name "file*" ! -name "*tar.gz" 

如果您想解压每个文件但保持一级压缩,即您将它们一直解压缩到它们的 *.tar.gz 形式,您可以这样做:

while ls *.tar.gz.tar.gz &> /dev/null; do find -name '*.tar.gz.tar.gz' | while read f; do tar xfz "$f" && rm -f "$f"; done; done

当至少有一个以 .tar.gz.tar.gz:

结尾的文件时,第一个 while 语句会循环
while ls *.tar.gz.tar.gz &> /dev/null; do

find 管道传输的第二个 while 语句用于解析所有当前的 .tar.gz.tar.gz

find -name '*.tar.gz.tar.gz' | while read f

请注意,如果一次提取失败,循环将 运行 无限,因为您将始终有一个 .tar.gz.tar.gz 文件,因此第一个循环将永远不会结束。