find ./someDir -name "*.php" -o -name "*.html" | tar -cf my_archive -T -
如果您使用的是 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
选项,所以答案是正确的,实际上是最好的
一种方法是:
tar -cf my_archive.tar $( find -name "*.php" -or -name "*.html" )
但是,这种方法有一些注意事项:
如果有任何文件或目录中包含空格,它将失败,如果文件太多以至于最大命令行长度已满,它将失败。
解决这些问题的方法是将 find 命令的内容输出到文件中,然后使用“-T, --files-from FILE”选项来 tar。
这将处理带有空格的路径:
find ./ -type f -name "*.php" -o -name "*.html" -exec tar uvf myarchives.tar {} +
把它们放在一个文件中
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
是可选的。
如果您想生成 压缩 tar 文件 (.tgz
) 并希望避免文件名中出现 空格 问题:
find . \( -name \*.php -o -name \*.html \) -print0 | xargs -0 tar -cvzf my_archive.tgz
find
的 -print0
“主要”使用 NULL (\0
) 字节分隔输出文件名,因此可以很好地与 xargs
的 -0
选项配合使用。
两个主 -name
周围的括号是必需的,因为否则 -print0
将只输出第二个 -name
的文件名(如果存在 -print
或 -print0
,则没有隐含的打印,并且这些只有如果对它们进行评估,则效果)。
如果您需要跳过一些文件名或目录(例如,如果您使用 Node.js,则为 node_modules
目录),请在前面添加一个或多个 -prune
主文件,如下所示:
find . -name skipThisName -prune -o \( -name \*.php -o -name \*.html \) -print0 | xargs -0 tar -cvzf my_archive.tgz
-o -name [pattern]