tar с шаблоном --include - PullRequest
       3

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

24 голосов
/ 21 апреля 2011

Ниже приведен фрагмент моего скрипта, который пытается собрать все 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, все файлы будут заархивированы.

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

Ответы [ 2 ]

78 голосов
/ 01 октября 2014

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

find . -name '*.php' | tar -cvjf my.tar.bz2 --files-from -
7 голосов
/ 21 апреля 2011

На самом деле я только что посмотрел на tar(1) в моей системе freebsd и нашел опцию --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) неожиданно, но (я полагаю) предназначено.Страница man говорит:

Process only files or directories that match the specified pattern.

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

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

...