tar -C mit einem Platzhaltermuster

17

Kann ich den Befehl tar verwenden, um Verzeichnisse zu ändern und ein Platzhalterdateimuster zu verwenden?

Folgendes versuche ich zu tun:

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

Es funktioniert, wenn ich das Verzeichnis (-C) nicht ändere, aber absolute Pfade in der TAR-Datei zu vermeiden versuche.

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

Hier sind einige der anderen Versuche, die ich gemacht habe:

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"

Und das ist der Fehler, den ich bekomme:

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

Ich weiß, dass es auch andere Möglichkeiten gibt, wie ich dies erreichen kann (mit find, xargs usw.), aber ich hatte gehofft, dies nur mit dem Befehl tar zu tun.

Irgendwelche Ideen?

Nick C.
quelle

Antworten:

18

Das Problem ist, dass die * .xml von der Shell interpretiert wird, nicht von tar. Daher befinden sich die gefundenen XML-Dateien (falls vorhanden) in dem Verzeichnis, in dem Sie den Befehl tar ausgeführt haben.

Sie müssten eine mehrstufige Operation verwenden (möglicherweise mit Pipes), um die gewünschten Dateien auszuwählen und sie dann zu tarieren.

Am einfachsten ist es, cdin das Verzeichnis zu gelangen, in dem sich die Dateien befinden:

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

sollte arbeiten.

In den Klammern sind die Befehle zusammengefasst, sodass Sie sich nach deren Abschluss immer noch in Ihrem ursprünglichen Verzeichnis befinden. Das && bedeutet, dass der tarTest nur ausgeführt wird, wenn die Initialisierung cderfolgreich war.

Majenko
quelle
9

Bei einem Ihrer Versuche:

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

Das Zeichen * wird in der Tat an tar übergeben. Das Problem ist jedoch, dass tar nur Platzhalter für die Namen der Mitglieder eines Archivs unterstützt. Während Sie beim Extrahieren oder Auflisten von Mitgliedern aus einem Archiv Platzhalter verwenden können, können Sie beim Erstellen eines Archivs keine Platzhalter verwenden.

In solchen Situationen greife ich oft darauf zurück (wie du bereits erwähnt hast). Wenn Sie GNU find haben, hat es die nette Option, nur den relativen Pfad mit der Option -printf zu drucken:

find '/path/to/file' -maxdepth 1 -name '*.xml' -printf '%P\0' \
| tar --null -C '/path/to/file' --files-from=- -cf 'example.tar'
Gaston
quelle