我目前有这个脚本:
find . -iname '*.log' -print0 | xargs -0 tar zcf $file
从给定目录中收集所有“*.log”文件。我想修改它以包括所有“.txt”文件,但我不知道该怎么做,这应该相当简单,对吧?
答案1
这几乎与 Raphael B. 的答案相同,但也可以处理超出最大参数长度的情况。我们只需告诉 tar 从 stdin(没有限制)读取要存档的文件名,而不是将它们作为参数即可:
find . \( -iname "*.log" -o -iname "*.txt" \) -print0 | tar --null --files-from=- -zcf "$file"
请注意,这是 GNU 特有的。其他 UNIX 或类 UNIX 系统上的 tar 无法理解--null
,但 Ubuntu 中的 tar 是 GNU tar,因此它可以在那里正常工作。
答案2
你走对了路。试试这个:
find . \( -iname "*.log" -or -iname "*.txt" \) -print0 | xargs -0 tar zcf $file
答案3
以下是对 xargs 无用使用的答案:
find \( -name "*.log" -or -name "*.txt" \) -exec tar zcf archiv2 {} +
我没有对很多文件进行测试——如果发现失败,我会很高兴收到一条评论和数字。
伪参数,您需要记住将 -delete 放在最后:嗯,是的,您也必须记住将 | xargs ... 放在最后,不是吗?
答案4
find . -regextype posix-extended -iregex '.*\.(log|txt)' -print0 | xargs -0 tar zcf $file
您可以'.*\.(log|txt)'
用任何替换POSIX 扩展正则表达式。
该示例匹配:
任意数量的任意字符
然后是'。'
然后是“log”或“txt”