【发布时间】:2013-09-14 21:53:03
【问题描述】:
我想对一个目录及其子目录中的所有 .php 和 .html 文件进行 tar 处理。如果我使用
tar -cf my_archive *
它会压缩所有我不想要的文件。如果我使用
tar -cf my_archive *.php *.html
它忽略子目录。我怎样才能使它递归地 tar 但只包含两种类型的文件?
【问题讨论】:
我想对一个目录及其子目录中的所有 .php 和 .html 文件进行 tar 处理。如果我使用
tar -cf my_archive *
它会压缩所有我不想要的文件。如果我使用
tar -cf my_archive *.php *.html
它忽略子目录。我怎样才能使它递归地 tar 但只包含两种类型的文件?
【问题讨论】:
find ./someDir -name "*.php" -o -name "*.html" | tar -cf my_archive -T -
【讨论】:
-o -name [pattern]
一种方法是:
tar -cf my_archive.tar $( find -name "*.php" -or -name "*.html" )
不过,这种方法有一些注意事项:
解决这些问题的方法是将 find 命令的内容输出到文件中,然后使用“-T, --files-from FILE”选项进行 tar。
【讨论】:
tar -cf my_archive `find ./ | grep '.php\|.html'`
使用“find”和“grep”获取所有目录及其子目录中.php和.html文件的所有路径。 然后将这些路径信息传递给 tar 进行压缩。
请小心那些符号 ` 和 '。另请注意,这将达到您的 shell 在命令行上允许的字符数的限制,这与其他一些答案不同。
【讨论】:
这将处理带有空格的路径:
find ./ -type f -name "*.php" -o -name "*.html" -exec tar uvf myarchives.tar {} +
【讨论】:
如果您使用的是 bash 版本 > 4.0,则可以利用 shopt -s globstar 来完成以下工作:
shopt -s globstar; tar -czvf deploy.tar.gz **/Alice*.yml **/Bob*.json
这将从任何子目录添加以 Alice 开头的所有 .yml 文件,并从任何子目录添加以 Bob 开头的所有 .json 文件。
【讨论】:
shopt -s globstar 选项,所以答案是正确的,实际上是最好的一个
将它们放在一个文件中
find . \( -name "*.php" -o -name "*.html" \) -print > files.txt
然后使用该文件作为 tar 的输入,根据您使用的 tar 版本使用 -I 或 -T
使用 h 复制符号链接
tar cfh my.tar -I files.txt
【讨论】:
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
【讨论】:
使用 zsh 很容易:
tar cvzf foo.tar.gz **/*.(php|html)
【讨论】:
-czvf?
- 是可选的 tar。