【问题标题】:Removing additional .tar.gz in the extension from several files in bash从 bash 中的多个文件中删除扩展名中的附加 .tar.gz
【发布时间】:2017-07-15 01:22:56
【问题描述】:

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

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

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

【问题讨论】:

  • 不能简单的去掉倍增的文件扩展名,每一步都必须重新解压,否则以后将无法使用文件。第二次压缩的文件与第一次压缩后的状态不同。
  • 对于您想要查看的操作,请查看find 实用程序及其exec 功能。
  • 你可能想看看“logrotate”,你可以很容易地设置它以一种很好的可配置方式自动压缩和重命名你的旧日志文件。

标签: linux bash rename file-extension


【解决方案1】:

您可以像这样使用简单的内联命令:

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

这将找到每个由 .tar.gz 完成的文件

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

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

希望对你有帮助。

【讨论】:

    【解决方案2】:

    即使您从文件中删除额外的 .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" 
    

    【讨论】:

    • 你需要使用 tar -xvzf 解压一个 gzip,你错过了 'z'。
    【解决方案3】:

    如果你想解压每个文件但保持一个级别的压缩,即你将它们一直解压缩到它们的 *.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 文件,因此第一个循环永远不会结束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-20
      • 1970-01-01
      • 2012-06-29
      • 2021-12-05
      • 2023-04-07
      • 2022-12-14
      • 2013-03-14
      • 1970-01-01
      相关资源
      最近更新 更多