我有一个bash脚本负责每天在目录下移动和压缩一些旧的日志文件。
进行一些测试我注意到脚本一次又一次地递归压缩每个压缩文件,所以现在我有一堆文件名为:$ files.log(.tar.gz * N天)。
是否可以从所有这些文件中删除所有额外的.tar.gz?
答案 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文件,因此第一个循环将永远不会结束。