tar与--include模式

时间:2011-04-21 17:41:33

标签: tar

以下是我尝试的脚本的片段 调整子目录中的所有php文件。它尝试使用'--include'参数 但似乎不起作用(输出来自bash中的'set -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文件,但tar似乎没有看到它们。如果我取出--include所有文件都被涂焦了。

我知道我可以使用find来提供列表 (find . -name '*.php' -print0 | tar -cvjf "my.tar.bz2" --null -T -),但--include param是错误的吗?

2 个答案:

答案 0 :(得分:76)

GNU tar 有一个-T or --files-from option,可以包含一个包含要包含的模式列表的文件。使用此选项指定的文件可以是" - "为stdin。因此,您可以使用 -files-from - 将用于tar的任意文件列表传递给stdin。你的例子变成了:

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

答案 1 :(得分:7)

实际上我只是在我的freebsd系统上查看了tar(1),我找到了一个--include选项(之前我曾在网上看过一些老人页面)。 --include选项非常强大。以下是一些例子

这些是文件

cnicutar@uranus ~/tar_test $ ls -1
a.c
b.c
x

简单的tar,归档所有内容

cnicutar@uranus ~/tar_test $ tar -cvf archive1.tar *
a a.c
a b.c
a x

仅存档C档

cnicutar@uranus ~/tar_test $ tar -cvf archive2.tar --include='*.c' *
a a.c
a b.c

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

修改

我试过了,感到很惊讶。 tar(1)的行为是意料之外的,但(我相信)是有意的。该手册页说:

Process only files or directories that match the specified pattern.

因此,当您指定模式时,它会筛选出与其不匹配的任何目录。因此,如果您的目录没有碰巧具有该扩展名(它有效但不常见)它将不会进入它们(即使内部可能存在“有趣”文件)。

总而言之,我认为最好使用另一种方式来递归枚举+过滤文件。