如何在所有子目录中压缩某些文件类型?


83

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

tar -cf my_archive *

它将所有文件焦油化,这是我不需要的。如果我用

tar -cf my_archive *.php *.html

它忽略子目录。如何递归使它成为tar但仅包含两种类型的文件?

Answers:


143

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


@DeeDee文件数量等是否有限制?
user1566515 2013年

1
@DeeDee-不,我的意思是你不需要parens!
Mike Makuch 2013年

@ user1566515可能有一些文件系统限制或整体空间限制,这将使tar文件达到上限。这完全取决于您自己的系统。否则,管道实际上会即时创建tar文件,因此不会受到文件编号或大小的限制。
DeeDee 2013年

谢谢!...如何添加2个以上的条件/种类的文件?
gluuke 2014年

5
@gluuke-o -name [pattern]用于每种新条件
DeeDee 2014年

15

如果您使用的是bash版本> 4.0,则可以利用它shopt -s globstar来简化此工作:

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

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


2
唯一使用tar的唯一答案是IMO的最佳答案。
simon

2
尽管glob'**'给目录留下了印象,但此命令不会递归执行(任何子文件夹)
Eddie

@Eddie **应该有效。您的参数可能有所不同。另外,请检查您在命令行中传递的文件夹名称中是否有空格。如果没有,您可以粘贴您的实际命令吗?
Sairam Krish

“ **”在到达命令之前由外壳程序评估,它仅显示为2个独立的*,解析为0或字符,它没有递归功能来跨越目录tldp.org/LDP/GNU-Linux-Tools-Summary/ html / x11655.htm
艾迪(Eddie)

2
@eddie是的,它是由shell评估的,尽管bash> 4.0有一个shopt -s globstar选项,所以答案是正确的,并且实际上是最佳答案
Roman Usherenko

13

一种方法是:

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

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

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

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


1)“失败”是指带有空格的文件将被跳过,还是不会创建tar归档文件?2)我有大约10万个文件。那超过了最大命令行长度吗?
user1566515 2013年

1
1.将创建存档,但将报告丢失的文件。2.我希望那太久了。鉴于此,最好使用下面的@DeeDee这样的方法,它将很好地解决这些问题。
罗宾·希尔德


0

将它们放在文件中

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

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

使用h复制符号链接

tar cfh my.tar -I files.txt 

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


-2
tar -cf my_archive `find ./ | grep '.php\|.html'`

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

请注意那些符号“和”。还要注意,这将达到外壳程序在命令行上允许输入多少个字符的限制,这与其他一些答案不同。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.