Unix 如何使用find命令对多个文件进行tar

Unix 如何使用find命令对多个文件进行tar,unix,gzip,tar,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;

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

}

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

find . -maxdepth 1 -name "${DAYTWOPREV}*" -type f | tar -czf archive.tar.gz -T -
-T-
是魔法
-T
表示“从给定文件读取文件列表”,第二个
-
表示“文件为标准输入”。(我添加了
z
选项以使用
gzip
压缩文件,并相应地命名了tar文件。您可能更喜欢
j
bzip2
扩展名为
.bz2
。您可能会发现您的
tar
本机支持
xz
压缩;选项字母在Mac OS X和B上是
-j
)SD和BSD支持lzma压缩的
--lzma
。)

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

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


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

我只需要这样做:

tar -cf $TARFILE ${DAYTWOPREV}*

得到。。。tar:无法使用多卷压缩存档。有关详细信息,请尝试使用
tar--help'或
tar--usage'。
-F
与GNU tar完全不同。显然,如果你能具体说明你的版本,那会有帮助的……我记错了选项字母;它是
-T
,而不是我最初写的
-F
。我已经修复了答案的这一方面。@JonathanLeffler我使用的是1.15.1版,它没有提供有关升级到GNU
tar
新版本的具体问题的详细信息;当前版本至少为1.23。1.15.1版于2004年12月底发布。从那时起,添加了许多新的和有用的功能,特别是支持多种压缩机制。当我尝试此操作时,它会在存档中提供两个相同的文件。tar如果三个tar文件与您指定的名称匹配,则这是正确的行为。如果希望所有名称都匹配,但以
.tar
结尾的名称除外,则必须告诉
find
(或
tar
)以排除要排除的名称。您可能还需要
-type f
选项(但tar文件无论如何都符合该标准)。
“*${daytowprev}*”
位是有问题的,因为在双引号中,shell可能会在将其交给
find
之前展开它。然而,将它放在单引号中意味着变量也不会展开。编辑以提出替代方案…好的,我更改了编辑…我试图回应Iniju的评论,但回应了你的评论…但我现在只是用一个文件测试它,但存档中有两个…你最初写的很好;双引号表示shell不会扩展元字符(
*
)。您应该强调,您正在使用
-r
选项来
tar
;这对您的命令的安全操作至关重要。(我正要斥责你不安全,但后来注意到了
-r
,而不是
-c
tar -cf $TARFILE ${DAYTWOPREV}*