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

use*_*515 68 linux tar

我想tar和目录及其子目录中的所有.php和.html文件.如果我使用

tar -cf my_archive *

它会记录我不想要的所有文件.如果我使用

tar -cf my_archive *.php *.html

它忽略了子目录.我如何递归地使它tar,但只包括两种类型的文件?

Dee*_*Dee 116

find ./someDir -name "*.php" -o -name "*.html" | tar -cf my_archive -T -

  • AFAIK没有理由把那些与逃脱的parens混淆起来,没有... (4认同)
  • @gluuke为每个新条件使用`-o -name [pattern]` (3认同)

小智 10

一种方法是:

tar -cf my_archive.tar $( find -name "*.php" -or -name "*.html" )
Run Code Online (Sandbox Code Playgroud)

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

  1. 如果有任何文件或目录中包含空格,它将失败,并且
  2. 如果有这么多文件,则最大命令行长度已满,它将失败.

解决这些问题的方法是将find命令的内容输出到文件中,然后使用"-T,--files-from FILE"选项来tar.


Sai*_*ish 7

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

tar -czvf deploy.tar.gz **/Alice*.yml **/Bob*.json
Run Code Online (Sandbox Code Playgroud)

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

  • @eddie 是的,它是由 shell 评估的,尽管 bash > 4.0 有一个 `shopt -s globstar` 选项,所以答案是正确的,实际上是最好的 (3认同)
  • 唯一使用tar的唯一答案是IMO的最佳答案。 (2认同)
  • 尽管glob'**'给目录留下了印象,但该命令不会递归执行(任何子子文件夹) (2认同)