tar -C z wzorem pliku wieloznacznego

17

Czy mogę użyć polecenia tar, aby zmienić katalogi i użyć wzorca pliku ze znakiem zastępczym?

Oto, co próbuję zrobić:

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

Działa, jeśli nie zmieniam katalogu (-C), ale staram się unikać ścieżek bezwzględnych w pliku tar.

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

Oto niektóre inne próby, które podjąłem:

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"

I to jest błąd, który otrzymuję:

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

Wiem, że istnieją inne sposoby, aby to zrobić (używając find, xargs itp.), Ale miałem nadzieję, że zrobię to tylko z poleceniem tar.

Jakieś pomysły?

Nick C.
źródło

Odpowiedzi:

18

Problem polega na tym, że * .xml jest interpretowany przez powłokę, a nie przez tar. Dlatego znalezione pliki xml (jeśli istnieją) znajdują się w katalogu, w którym uruchomiono polecenie tar.

Będziesz musiał użyć operacji wieloetapowej (być może z udziałem potoków), aby wybrać żądane pliki, a następnie tarować je.

Najprostszym sposobem byłoby po prostu cdprzejście do katalogu, w którym znajdują się pliki:

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

powinno działać.

Nawiasy grupują polecenia razem, więc po ich zakończeniu będziesz nadal w oryginalnym katalogu. && oznacza, że taruruchomi się tylko wtedy, gdy inicjalizacja cdzakończyła się powodzeniem.

Majenko
źródło
9

W jednej z twoich prób:

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

znak * jest rzeczywiście przekazywany do tar. Problem polega jednak na tym, że tar obsługuje dopasowanie tylko symboli wieloznacznych w nazwach członków archiwum. Tak więc, chociaż możesz używać symboli wieloznacznych podczas wyodrębniania lub wyświetlania członków z archiwum, nie możesz używać symboli wieloznacznych podczas tworzenia archiwum.

W takich sytuacjach często szukam (jak już wspomniałeś). Jeśli masz GNU find, to jest fajna opcja, aby wydrukować tylko ścieżkę względną, używając opcji -printf:

find '/path/to/file' -maxdepth 1 -name '*.xml' -printf '%P\0' \
| tar --null -C '/path/to/file' --files-from=- -cf 'example.tar'
gaston
źródło