104

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

tar -cf my_archive *

它会压缩所有我不想要的文件。如果我使用

tar -cf my_archive *.php *.html

它忽略子目录。我怎样才能使它递归地 tar 但只包含两种类型的文件?

4

8 回答 8

172

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

于 2013-09-11T02:42:30.017 回答
24

如果您使用的bash版本 > 4.0,您可以利用shopt -s globstar它来完成以下工作:

shopt -s globstar; tar -czvf deploy.tar.gz **/Alice*.yml **/Bob*.json

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

于 2017-08-23T09:14:32.847 回答
17

一种方法是:

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

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

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

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

于 2013-09-11T02:42:56.463 回答
4

这将处理带有空格的路径:

find ./ -type f -name "*.php" -o -name "*.html" -exec tar uvf myarchives.tar {} +
于 2016-12-20T16:25:51.903 回答
1

把它们放在一个文件中

find . \( -name "*.php" -o -name "*.html" \) -print > files.txt

然后将该文件用作 tar 的输入,根据您使用的 tar 版本使用 -I 或 -T

使用 h 复制符号链接

tar cfh my.tar -I files.txt 
于 2018-06-18T12:13:53.253 回答
0

find ./ -type f -name "*.php" -o -name "*.html" -printf '%P\n' |xargs tar -I 'pigz -9' -cf target.tgz

对于多核或仅用于一个核心:

find ./ -type f -name "*.php" -o -name "*.html" -printf '%P\n' |xargs tar -czf target.tgz

于 2019-02-26T00:31:06.167 回答
0

使用 zsh 很容易:

tar cvzf foo.tar.gz **/*.(php|html)
于 2021-12-07T13:09:56.240 回答
-2
tar -cf my_archive `find ./ | grep '.php\|.html'`

使用“find”和“grep”获取所有目录及其子目录中.php和.html文件的所有路径。然后将这些路径信息传递给 tar 进行压缩。

请注意那些符号 ` 和 '。另请注意,与其他一些答案不同,这将达到您的 shell 在命令行上允许的字符数的限制。

于 2013-09-11T02:46:50.863 回答