15

Можно ли использовать команду 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.

Есть идеи?

2 ответа2

16

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

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

Проще всего было бы просто быть cd - диск в каталог , где файлы являются:

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

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

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

8

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

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'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .