Problém je v tom, že *.xml je interpretován shellem, nikoli tar. Soubory xml, které najde (pokud nějaké existují), jsou tedy v adresáři, ve kterém jste spustili příkaz tar.
Museli byste použít vícestupňovou operaci (možná zahrnující potrubí) k výběru požadovaných souborů a poté je tarovat.
Nejjednodušší způsob by byl právě cd
do adresáře, kde jsou soubory:
$ (cd /path/to/file && tar -cf /path/to/example.tar *.xml)
by mělo fungovat.
Závorky seskupují příkazy dohromady, takže po jejich dokončení budete stále ve svém původním adresáři. &&znamená tar
spustí se pouze v případě, že počáteční cd
bylo úspěšné.
V jednom z vašich pokusů:
tar -cf example.tar -C /path/to/file "*.xml"
znak * je skutečně předán tar. Problém je však v tom, že tar podporuje shodu zástupných znaků pouze u jmen členů archivu. Takže zatímco můžete použít zástupné znaky při extrahování nebo výpisu členů z archivu, nemůžete použít zástupné znaky při vytváření archivu.
V takových situacích se často uchýlím k hledání (jak jste již zmínil). Pokud máte GNU find, má příjemnou možnost vytisknout pouze relativní cestu pomocí volby -printf:
find '/path/to/file' -maxdepth 1 -name '*.xml' -printf '%P\0' \
| tar --null -C '/path/to/file' --files-from=- -cf 'example.tar'
Přijatá odpověď předpokládá, že soubory jsou převzaty z jednoho adresáře. Pokud používáte více -C
možnosti, pak potřebujete obecnější přístup. Následující příkaz má shell rozbalit názvy souborů, které jsou pak předány tar .
tar -cf example.tar -C /path/to/file $(cd /path/to/file ; echo *.xml)