2011-04-21 113 views
15

以下是从我试图 tar脚本中的所有php文件在一个subdir中的脚本片段。它试图用“--include”参数 但似乎并没有工作(输出是在bash“设置-x”)焦油与 - 包括模式

+ find . -name '*.php' 
./autoload.php 
./ext/thrift_protocol/run-tests.php 
./protocol/TBinaryProtocol.php 
... 
./transport/TTransportFactory.php 
+ tar -cvjf my.tar.bz2 '--include=*.php' . 
+ set +x 

find发现了几个PHP文件,但焦油似乎没有看到他们。如果我拿出--include所有文件都是tarred。

我知道我可以使用找到养活列表 (find . -name '*.php' -print0 | tar -cvjf "my.tar.bz2" --null -T -),但什么毛病--include PARAM?

+0

属于上unix.stackexchange.com – 2011-04-21 17:53:52

+0

嗯如果是的话 - 应该真的是在一个SO'tar'标签? – nhed 2011-04-21 17:57:59

+4

@nhed'GNU tar'和'BSD tar'都不识别'--include'。你使用的是什么版本的“tar”? – cnicutar 2011-04-21 18:01:44

回答

6

其实我只是看着我的freebsd系统上的tar(1),我发现了一个--include选项(早些时候我在网上看过一些老版本的页面)。 --include选项非常强大。下面是一些例子

这些文件

[email protected] ~/tar_test $ ls -1 
a.c 
b.c 
x 

简单焦油,封存所有

[email protected] ~/tar_test $ tar -cvf archive1.tar * 
a a.c 
a b.c 
a x 

仅存档C文件

[email protected] ~/tar_test $ tar -cvf archive2.tar --include='*.c' * 
a a.c 
a b.c 

因此,脚本中可能出现的错误是您输入焦油.而不是.*作为最后一个参数。

编辑

我已经尝试过了,很吃惊。 tar(1)的行为是意想不到的,但(我相信)意图。该手册页说:

Process only files or directories that match the specified pattern. 

因此,当您指定模式时,它会过滤掉任何不匹配的目录。所以如果你的目录没有碰到这个扩展名(它是有效的但不常见)它不会下降到(即使内部深处可能有“有趣的”文件)。

所以最后我相信最好用另一种方式递归枚举+过滤器文件。

+0

你尝试任何递归?不像'zip','tar'默认是递归的。这似乎打破了这里。我更喜欢**它不便携式,不要使用它**的方法。我的意思是,为什么要用'tar -cvf x.tar * .c'完成同样的事情呢? – nhed 2011-04-21 19:58:30

+1

这是命令不能满足所有称皮重'* .c'文件?:的'tar -cvf archive2.tar * .c' – yeliabsalohcin 2017-09-12 10:00:02

+0

--include选项的GNU tar不存在作为V1.30的! – Enzo 2018-03-08 14:37:08

46

GNU 焦油有一个-T or --files-from option可以采取包含模式列表的文件包括。使用此选项指定的文件对于stdin可以是“ - ”。因此,你可以传递一个tar文件的任意列表,从标准输入使用-files-from-。你举的例子就变成:

find . -name '*.php' | tar -cvjf my.tar.bz2 --files-from - 
+1

接受的答案不适用于我,但这太棒了! – vsnyc 2015-12-15 21:35:46

+1

另外,如果你想拥有匹配多个模式进入tar文件事情,你可以做这样的事情: 发现。 -regex“。* \。php”-o -regex“。* \。css”|焦油cvzf stuff.tgz --files - 从 - – 2016-02-10 03:35:52

+0

这不包括空direcories,不是吗? – 2017-05-12 17:17:13