【问题标题】:Naming tar archive the same as source file将 tar 存档命名为与源文件相同
【发布时间】:2015-07-28 22:38:45
【问题描述】:

很简单,我想从文件创建存档并保留文件名。

File = host1.log
Tar  = Archive_date_host1.tar.gz

我是这样使用的:

find /var/log/TESTIN/ -daystart -mtime 7 -type f | xargs tar -czPf /var/log/TESTOUT/ARCHIVE_$(date +%F)_FILENAMEHERE.tar.gz

我可以做的“存档”和日期部分,但有没有办法获取文件名并使用它?我用谷歌搜索了一堆,似乎找不到任何东西。

【问题讨论】:

    标签: linux tar


    【解决方案1】:

    看起来您想使用每个文件的basename作为输出文件的变量部分,即删除名称的目录部分和.log后缀。试试这个:

    find /var/log/TESTIN/ -daystart -mtime 7 -type f | \
    xargs -I {} sh -c 'tar -czPf /var/log/TESTOUT/ARCHIVE_$(date +%F)_$(basename {} .log).tar.gz {}'
    

    【讨论】:

    • 效果很好。只是一个快速跟进的问题。我没有使用 xargs 所以我还在学习。 sh -c 究竟做了什么?
    • sh -c 命令将字符串作为参数并将其作为 shell 命令运行,执行所有常规操作,例如命令替换 ($(...))。 xargs 可以运行任何单个命令,但它不一定使用 shell 来执行此操作,并且尝试嵌套命令 - 要求 xargs 运行 basename {} 并使用其输出形成 tar 命令的一部分 - 可能是单独使用 xargs 有点混乱;让 shell 完成这项工作会更容易。
    【解决方案2】:

    我认为只需find 就足够了。例如,以下命令使用您想要的命名方案从找到的每个文件中创建一个 .tar.gz 存档。请注意,{} 被替换为找到的文件名,

    find * -type f -exec tar -czf ARCHIVE_$(date +%F)_{}.tar.gz {} \;
    

    【讨论】:

    • 这里的关键是使用-exec,它可以让你访问find 定位的每一个东西。
    猜你喜欢
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多