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 інтерпретується оболонкою, а не дьогтем. Тому файли xml, які він знаходить (якщо такі є), знаходяться в каталозі, в якому ви запустили команду tar.

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

Найпростішим способом було б просто потрапити cdв каталог, де знаходяться файли:

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

повинні працювати.

В дужках групуються команди разом, тому, коли вони закінчаться, ви все одно будете знаходитись у своєму початковому каталозі. && означає, що tarзапуск буде виконуватися лише в тому випадку, коли початковий cdбув успішним.


9

В одній із ваших спроб:

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

символ * дійсно передається в тар. Проблема, однак, полягає в тому, що 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'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.