如何使用find命令tar多个文件

时间:2012-09-18 15:09:37

标签: unix gzip tar

我正在尝试使用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;

}

4 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

顺便提一下,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创建是一个不必要的步骤。但是,我现在无法测试)

答案 3 :(得分:0)

我会这样做:

tar -cf $TARFILE ${DAYTWOPREV}*