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 tar-Befehl ausgeführt haben.
Sie müssten eine mehrstufige Operation (möglicherweise mit Pipes) verwenden, um die gewünschten Dateien auszuwählen und sie dann zu tarn.
Der einfachste Weg wäre einfach zu cd
in das Verzeichnis, in dem sich die Dateien befinden:
$ (cd /path/to/file && tar -cf /path/to/example.tar *.xml)
sollte funktionieren.
Die Klammern gruppieren die Befehle zusammen, sodass Sie sich nach Beendigung immer noch in Ihrem ursprünglichen Verzeichnis befinden. Das &&bedeutet die tar
wird nur ausgeführt, wenn der anfängliche cd
war erfolgreich.
In einem Ihrer Versuche:
tar -cf example.tar -C /path/to/file "*.xml"
das *-Zeichen wird tatsächlich an tar übergeben. Das Problem ist jedoch, dass tar nur Wildcard-Matching für die Namen von Mitgliedern 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 zu (wie du schon erwähnt hast). Wenn Sie GNU find haben, hat es die nette Option, nur den relativen Pfad auszugeben, indem Sie die Option -printf verwenden:
find '/path/to/file' -maxdepth 1 -name '*.xml' -printf '%P\0' \
| tar --null -C '/path/to/file' --files-from=- -cf 'example.tar'
Die akzeptierte Antwort geht davon aus, dass die Dateien aus einem einzigen Verzeichnis stammen. Wenn Sie mehrere -C
verwenden Optionen, dann benötigen Sie einen allgemeineren Ansatz. Der folgende Befehl lässt die Shell die Dateinamen erweitern, die dann an tar übergeben werden .
tar -cf example.tar -C /path/to/file $(cd /path/to/file ; echo *.xml)