tar -C с шаблоном подстановочного файла

17

Можно ли использовать команду tar для изменения каталогов и использования шаблона файла с подстановочными знаками?

Вот что я пытаюсь сделать:

tar -cf example.tar -C /path/to/file *.xml

Это работает, если я не меняю каталог (-C), но я стараюсь избегать абсолютных путей в файле tar.

tar -cf example.tar /path/to/file/*.xml

Вот некоторые из других попыток, которые я сделал:

tar -cf example.tar -C /path/to/file *.xml
tar -cf example.tar -C /path/to/file/ *.xml
tar -cf example.tar -C /path/to/file/ ./*.xml
tar -cf example.tar -C /path/to/file "*.xml"

И это ошибка, которую я получаю:

tar: *.xml: Cannot stat: No such file or directory

Я знаю, что есть другие способы сделать это (используя find, xargs и т. Д.), Но я надеялся сделать это с помощью команды tar.

Есть идеи?

Ник С.
источник

Ответы:

18

Проблема в том, что * .xml интерпретируется оболочкой, а не tar. Поэтому найденные им xml-файлы (если они есть) находятся в каталоге, в котором вы выполнили команду tar.

Вам нужно будет использовать многоступенчатую операцию (возможно, с использованием каналов), чтобы выбрать нужные файлы, а затем скопировать их.

Самый простой способ - войти cdв каталог, где находятся файлы:

$ (cd /path/to/file && tar -cf /path/to/example.tar *.xml)

должно сработать.

Скобки группируют команды вместе, поэтому, когда они завершатся, вы все равно будете в исходном каталоге. && означает, что tarбудет выполняться только в том случае, если начальный cdбыл успешным.

Majenko
источник
9

В одной из ваших попыток:

tar -cf example.tar -C /path/to/file "*.xml"

символ * действительно передается в tar. Проблема, однако, заключается в том, что tar поддерживает сопоставление с подстановочными знаками только для имен членов архива. Таким образом, хотя вы можете использовать подстановочные знаки при извлечении или выводе списка участников из архива, вы не можете использовать подстановочные знаки при создании архива.

В таких ситуациях я часто прибегаю к поиску (как вы уже упоминали). Если у вас есть GNU find, у него есть хорошая опция для печати только относительного пути, используя опцию -printf:

find '/path/to/file' -maxdepth 1 -name '*.xml' -printf '%P\0' \
| tar --null -C '/path/to/file' --files-from=- -cf 'example.tar'
Гастон
источник