web-dev-qa-db-ja.com

--includeパターンを使用したtar

以下は、サブディレクトリ内のすべての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?

29
nhed

実際、私は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.
_

したがって、パターンを指定すると、一致しないディレクトリはすべて除外されます。したがって、ディレクトリにその拡張子が付いていない場合(有効ですが一般的ではありません)ディレクトリに下がることはありません(内部に「興味深い」ファイルがある場合でも)。

したがって、結論として、ファイルを再帰的に列挙する+別の方法を使用するのが最善だと思います。

7
cnicutar

GNU tarには -Tまたは-がありますfiles-fromオプション 含めるパターンのリストを含むファイルを取得できます。このオプションで指定するファイルは、stdinの場合は「-」にすることができます。したがって、-files-from-を使用して、tarがアーカイブするファイルの任意のリストをstdinから渡すことができます。あなたの例は次のようになります:

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