Tar с шаблоном -include

Ниже приведен фрагмент из script, который у меня есть для загрузки всех php файлов в поддире. Он пытается использовать параметр '--include' но не работает (вывод выполняется из 'set -x' в bash)

+ 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, все файлы будут tarred.

Я знаю, что могу использовать find для подачи списка (find . -name '*.php' -print0 | tar -cvjf "my.tar.bz2" --null -T -), но что не так с параметром --include?

Ответы

Ответ 1

На самом деле я просто заглянул в tar(1) в мою систему freebsd, и я нашел вариант -include (ранее я смотрел на старую страницу в Интернете). Параметры --include достаточно мощные. Вот несколько примеров

Это файлы

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

Простой tar, архивируйте все

[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

Итак, что, вероятно, неверно в вашем script, заключается в том, что в качестве последнего аргумента вы указываете tar . вместо .*.

ИЗМЕНИТЬ

Я попробовал и удивился. Поведение tar(1) неожиданно, но (я считаю). На странице руководства написано:

Process only files or directories that match the specified pattern.

Поэтому, когда вы укажете шаблон, он отфильтровывает любые каталоги, которые не соответствуют ему. Поэтому, если у ваших каталогов нет этого расширения (оно действительно, но необычно) , он не будет спускаться в них (даже если в глубине могут быть "интересные" файлы).

Итак, в заключение я считаю, что было бы лучше использовать другой способ рекурсивно перечислить + файлы фильтров.

Ответ 2

GNU tar имеет -T или - файлы из > , который может содержать файл, содержащий список шаблонов для включения. Файл, указанный этой опцией, может быть "-" для stdin. Таким образом, вы можете передать произвольный список файлов для tar для архивации из stdin с помощью -files-from -. Ваш пример будет выглядеть следующим образом:

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