以下は、サブディレクトリ内のすべてのphpファイルをtarで圧縮しようとするスクリプトのスニペットです。 '--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
すべてのファイルがtarされています。
Findを使用してリストをフィードできることを知っています(find . -name '*.php' -print0 | tar -cvjf "my.tar.bz2" --null -T -
)、しかし--include
param?
実際、私はfreebsdシステムでtar(1)
を調べただけで、-includeオプションが見つかりました(以前はオンラインの古いmanページを調べていました)。 _--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.
_
したがって、パターンを指定すると、一致しないディレクトリはすべて除外されます。したがって、ディレクトリにその拡張子が付いていない場合(有効ですが一般的ではありません)ディレクトリに下がることはありません(内部に「興味深い」ファイルがある場合でも)。
したがって、結論として、ファイルを再帰的に列挙する+別の方法を使用するのが最善だと思います。
GNU tarには -Tまたは-がありますfiles-fromオプション 含めるパターンのリストを含むファイルを取得できます。このオプションで指定するファイルは、stdinの場合は「-」にすることができます。したがって、-files-from-を使用して、tarがアーカイブするファイルの任意のリストをstdinから渡すことができます。あなたの例は次のようになります:
find . -name '*.php' | tar -cvjf my.tar.bz2 --files-from -