关于linux:如何tar所有子目录中的某些文件类型?

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 -


一种方法是:

1
tar -cf my_archive.tar $( find -name"*.php" -or -name"*.html" )

但是,这种方法有一些注意事项:

  • 如果文件或目录中有空格,则会失败,并且
  • 如果文件太多,最大命令行长度已满,则此操作将失败。
  • 解决方法可能是将find命令的内容输出到一个文件中,然后使用"-t,-filesforfile"选项来tar。


    要用不同的模式压缩多个文件,我们可以用空格分隔它们,并将它们全部添加到gz文件中,如下所示:

    1
    tar -czvf deploy.tar.gz **/Alice*.yml **/Bob*.json

    这将从任何子目录中添加以alice开头的所有.yml文件,并从任何子目录中添加以bob开头的所有.json文件。


    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在命令行上允许的字符数的限制,与其他一些答案不同。