从bash中的几个文件中删除扩展中的其他.tar.gz

时间:2017-02-24 09:14:41

标签: linux bash rename file-extension

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

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

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

3 个答案:

答案 0 :(得分:5)

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

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

这将找到.tar.gz

完成的每个文件

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

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

希望它有所帮助。

答案 1 :(得分:0)

  

即使您要从文件中删除额外的.tar.gz扩展名,也是如此   没有用,请查看以下示例 -

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

重命名:

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

解压缩:

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

表示生成的file1.tar.gz(实际上是.tar.gz.tar.gz)   file1.tar.gz所以你必须再次解压缩文件。

     

为了避免这种情况 - 您需要在脚本中进行更改。   在选择要压缩的文件时,您应该避免使用   压缩文件使用下面的cmd

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

答案 2 :(得分:0)

如果你想解压每个文件但保持一个级别的压缩,即你将它们解压缩到* .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

第一个while语句是循环的,而至少有一个文件以.tar.gz.tar.gz结尾:

while ls *.tar.gz.tar.gz &> /dev/null; do

来自while的第二个find语句可以解析当前的所有内容.tar.gz.tar.gz

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

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