2017-02-24 44 views
1

我有一个bash脚本负责每天在一个目录下移动和压缩一些旧的日志文件。从bash中的几个文件中删除附加的.tar.gz

做一些测试我发现脚本一次又一次地递归压缩每个压缩文件,所以现在我有一堆文件的文件名为:$ files.log(.tar.gz * N days)。

可能从所有这些文件中删除每个额外的.tar.gz?

+1

你不能简单地删除相乘的文件扩展名,你必须再次解压缩每一步,否则你将无法以后使用这些文件。第二次压缩的文件与第一次压缩后的状态不同。 – arkascha

+0

对于您想要查看'find'实用程序及其'exec'功能的操作。 – arkascha

+0

你可能想看看“logrotate”,你可以很容易地设置它来以一种很好的可配置的方式自动压缩和重命名旧的日志文件。 – sheltond

回答

3

您可以使用一个简单的内联的命令是这样的:{老%%焦油*}

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

这将找到名为.tar.gz

$完成每一个文件将得到所有的文件名和扩展,直到找到第一个“.tar”。

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

希望它有帮助。

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 

Un压缩:

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" 
+0

你需要使用tar -xvzf来解开gzip,你错过了'z'。 – FreudianSlip

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文件,所以第一个循环将永远不会结束。