以下是我尝试的脚本的片段 调整子目录中的所有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是错误的吗?
答案 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.
因此,当您指定模式时,它会筛选出与其不匹配的任何目录。因此,如果您的目录没有碰巧具有该扩展名(它有效但不常见)它将不会进入它们(即使内部可能存在“有趣”文件)。
总而言之,我认为最好使用另一种方式来递归枚举+过滤文件。