我正在尝试使用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;
}
答案 0 :(得分:3)
您可以告诉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和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}*