How to tar certain file types in all subdirectories?
我要tar和目录及其子目录中的所有.php和.html文件。如果我使用
tar -cf my_archive *
这是所有文件的tar,我不想要。如果我使用
tar -cf my_archive *.php *.html
它忽略子目录。我怎样才能使它递归地tar,但只包含两种类型的文件?
find ./someDir -name"*.php" -o -name"*.html" | tar -cf my_archive -T -
- 阿法克没有理由和逃走的帕伦斯混在一起,没有……
- @Koodawg谢谢你的建议!在我测试过的操作系统(Centos6.4)上,如果不转义括号,命令就无法工作。
- @迪迪文件的数量有限制吗?
- @迪迪-不,我的意思是你不需要帕伦斯!
- @用户1566515可能存在一些文件系统限制或总空间限制,这会对tar文件设置一个上限。这完全取决于你自己的系统。否则,管道基本上会动态地创建tar文件,因此您不会受到文件编号或大小的约束。
- 不需要parens'find./somedir-name"*.php"-o-name"*.html"tar-cf my_archive-t-'
- @你说得对。我相应地更新了答案。谢谢!
- 谢谢!这很管用。
- 谢谢!…如何添加2个以上条件/种类的文件?
- @Gluke对每种新情况使用-o -name [pattern]。
- @迪迪:不好意思,不知什么原因,我要买find: paths must precede expression Usage: find [-H] [-L] [-P] [path...] [expression]。
一种方法是:
1
| tar -cf my_archive.tar $( find -name"*.php" -or -name"*.html" ) |
但是,这种方法有一些注意事项:
如果文件或目录中有空格,则会失败,并且
如果文件太多,最大命令行长度已满,则此操作将失败。
解决方法可能是将find命令的内容输出到一个文件中,然后使用"-t,-filesforfile"选项来tar。
- 1)"失败"是指跳过带有空格的文件,还是不创建tar存档?2)我有大约10万份文件。是否超过了最大命令行长度?
- 1。它将创建存档,但会报告丢失的文件。2。我想那太久了。鉴于此,您最好使用下面@deedee建议的方法,它可以很好地解决这些问题。
要用不同的模式压缩多个文件,我们可以用空格分隔它们,并将它们全部添加到gz文件中,如下所示:
1
| tar -czvf deploy.tar.gz **/Alice*.yml **/Bob*.json |
这将从任何子目录中添加以alice开头的所有.yml文件,并从任何子目录中添加以bob开头的所有.json文件。
- 唯一使用焦油的答案,是我的最佳答案。
- 尽管glob对directory有"**"的印象,但此命令不会递归执行(任何子文件夹)
- @埃迪**应该工作。可能你的参数有什么不同。还要检查在命令行中传递的文件夹名中是否有任何空间。如果没有,可以粘贴实际的命令吗?
- "**"在到达命令之前由shell进行评估,它只被视为2个独立的*解析为0或字符,它没有递归功能来跨越目录tldp.org/ldp/gnu-linux-tools-summary/html/x11655.htm
- @Eddie是的,它是由shell评估的,尽管bash>4.0有一个shopt -s globstar选项,所以答案是正确的,实际上是最好的。
find ./ -type f -name"*.php" -o -name"*.html" -printf '%P
' |xargs tar -I 'pigz -9' -cf target.tgz
对于多核或单核:
find ./ -type f -name"*.php" -o -name"*.html" -printf '%P
' |xargs tar -czf target.tgz
把它们放进文件里
1
| find . \( -name"*.php" -o -name"*.html" \) -print > files.txt |
然后使用文件作为tar的输入,根据使用的tar版本使用-i或-t
使用h复制符号链接
1
| tar cfh my.tar -I files.txt |
这将处理带有空格的路径:
1
| find ./ -type f -name"*.php" -o -name"*.html" -exec tar uvf myarchives.tar {} + |
1
| tar -cf my_archive `find ./ | grep '.php\|.html'` |
使用"find"和"grep"获取所有目录及其子目录中.php和.html文件的所有路径。然后将这些路径信息传递给tar进行压缩。
请小心那些符号"和"。还请注意,这将达到shell在命令行上允许的字符数的限制,与其他一些答案不同。