tar -C avec un motif de fichier générique

17

Puis-je utiliser la commande tar pour changer de répertoire et utiliser un modèle de fichier générique?

Voici ce que j'essaie de faire:

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

Cela fonctionne si je ne change pas de répertoire (-C), mais j'essaie d'éviter les chemins absolus dans le fichier tar.

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

Voici quelques-unes des autres tentatives que j'ai faites:

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"

Et voici l'erreur que j'obtiens:

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

Je sais qu'il existe d'autres façons de faire fonctionner cela (en utilisant find, xargs, etc.) mais j'espérais le faire avec juste la commande tar.

Des idées?

Nick C.
la source

Réponses:

18

Le problème est que le * .xml est interprété par le shell, pas par tar. Par conséquent, les fichiers xml qu'il trouve (le cas échéant) se trouvent dans le répertoire dans lequel vous avez exécuté la commande tar.

Vous devrez utiliser une opération en plusieurs étapes (impliquant peut-être des canaux) pour sélectionner les fichiers que vous souhaitez, puis les tarer.

Le moyen le plus simple serait simplement de rentrer cddans le répertoire où se trouvent les fichiers:

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

devrait marcher.

Les crochets regroupent les commandes, donc quand elles auront fini, vous serez toujours dans votre répertoire d'origine. Le && signifie que le test tars'exécutera uniquement si l'initialisation cda réussi.

Majenko
la source
9

Dans l'une de vos tentatives:

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

le caractère * est en effet passé à tar. Le problème, cependant, est que tar ne prend en charge que la correspondance générique sur les noms des membres d'une archive. Ainsi, bien que vous puissiez utiliser des caractères génériques lors de l'extraction ou de la liste des membres d'une archive, vous ne pouvez pas utiliser de caractères génériques lorsque vous créez une archive.

Dans de telles situations, j'ai souvent recours à trouver (comme vous l'avez déjà mentionné). Si vous avez GNU find, il a la bonne option pour imprimer uniquement le chemin relatif, en utilisant l'option -printf:

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