【问题标题】:How to tar multiple files with the find command如何使用 find 命令对多个文件进行 tar
【发布时间】:2012-09-18 15:09:36
【问题描述】:

我正在尝试使用 find 命令对多个文件进行 tar。我想在文件名中找到包含特定字符串的目录中的所有文件,然后对这些文件进行 tar。我想在文件名中找到的字符串是日期。

例如,我有一个名为 ulog.20120914.log 的文件

我现在正在做的是:

DAYTWOPREV=`date +%Y%m%d --date='2 days ago'`

function archive {
    cd $1;
    if [ ! -d archive ]; then
        mkdir archive;
    fi

TMPFILE=`mktemp`;
    find . -maxdepth 1 -name "${DAYTWOPREV}*" -type f -print0  > $TMPFILE;


    TARFILE=archive/${DAYTWOPREV}$2.tar;
    if [ ! -e $TARFILE ]; then
        echo tar cfT $TARFILE /dev/null;
        tar cfT $TARFILE /dev/null;
    fi  

cat $TMPFILE | xargs -0r tar rf $TARFILE
    cat $TMPFILE | xargs -0r rm -rf
    rm -f $TMPFILE;

}

【问题讨论】:

    标签: unix gzip tar


    【解决方案1】:

    假设您有 GNU tar(即在 Linux,而不是 AIX,或 HP-UX 或 ...):

    find . -maxdepth 1 -type f -print0 | grep -z "${DAYTWOPREV}" | tar -cvf archive.tar --null -T /dev/stdin
    

    【讨论】:

    • 当我尝试这个时,它会在 archive.tar 中给我两个相同的文件
    • 如果三个 tar 文件与您指定的名称匹配,那么这是正确的行为。如果您想要除以.tar 结尾的名称之外的所有匹配名称,您必须告诉find(或tar)排除您想要排除的名称。您可能还需要 -type f 选项(但 tar 文件无论如何都符合该标准)。
    • "*${DAYTWOPREV}*" 位是有问题的,因为在双引号中,shell 可能会在将其交给find 之前扩展它。但是,将它放在单引号中意味着变量也不会被扩展。正在编辑以提出替代方案...
    • 好的,我更改了我的编辑...我试图回复 inijus 评论,但回复了您的评论...但我现在只是用一个文件测试它,但存档中有两个。 ..
    • 你原来写的没问题;双引号表示 shell 不会扩展元字符 (*)。
    【解决方案2】:

    您可以告诉 GNU tar 从其标准输入中读取要归档的文件列表:

    find . -maxdepth 1 -name "${DAYTWOPREV}*" -type f | tar -czf archive.tar.gz -T -
    

    -T - 是魔法; -T 表示“从给定文件中读取文件列表”,(第二个)- 表示“文件是标准输入”。 (我添加了 z 选项以使用 gzip 压缩文件并相应地命名 tar 文件。您可能更喜欢带有 .bz2 扩展名的 jbzip2。您可能会发现您的 tar 支持 @987654332 @ 原生压缩;在 Mac OS X 和 BSD 上,选项字母为 -J。BSD 支持 --lzma 进行 LZMA 压缩。)

    此外,使用 GNU tar,您可以指定选项 --null(然后使用 GNU find 使用 -print0)来处理包含换行符的文件名。如前所述,如果文件名包含换行符,则会出现问题;否则,它每行一个文件足够可靠,空格和所有。

    【讨论】:

    • Getting... tar:无法使用多卷压缩档案尝试tar --help' or tar --usage' 了解更多信息。
    • -F 与 GNU tar 完全不同。显然,如果您可以指定您拥有的版本会有所帮助...
    • 我记错了选项字母;它是-T,而不是我最初写的-F。我已经修复了答案的这方面。
    • @JonathanLeffler 我正在使用 1.15.1 版本,它没有提供有关特定问题的更多信息
    • 是时候升级到更新版本的 GNU tar;当前版本至少为 1.23。 1.15.1 版于 2004 年 12 月发布。从那时起,添加了许多有用的新功能,特别是对多种压缩机制的支持。
    【解决方案3】:

    我会这样做:

    tar -cf $TARFILE ${DAYTWOPREV}*
    

    【讨论】:

      【解决方案4】:

      顺便说一句,tar 确实有一个选项(r 而不是 c)可以解决其中一些其他解决方案的“多次调用 tar”问题。

      find . -maxdepth 1 -name '*20120914*' -exec tar rvf archive.tar {} +
      
      find . -maxdepth 1 -name '*20120914*' -print0 | xargs -0 tar rvf archive.tar
      

      实际上,您似乎已经在使用它了。您现有的解决方案究竟缺少什么? (除了 - 我不认为您实际上需要 tar 文件存在,因此 /dev/null 创建是不必要的步骤。但是,我现在无法测试)

      【讨论】:

      • 你应该强调你正在使用-r选项到tar;这对您的命令的安全操作至关重要。 (我正要斥责你不安全,但后来注意到-r而不是-c。)
      猜你喜欢
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      • 1970-01-01
      • 2016-05-28
      • 1970-01-01
      相关资源
      最近更新 更多