El problema es que el *.xml es interpretado por el shell, no por tar. Por lo tanto, los archivos xml que encuentra (si los hay) están en el directorio en el que ejecutó el comando tar.
Tendría que usar una operación de varias etapas (quizás involucrando tuberías) para seleccionar los archivos que desea y luego tararlos.
La forma más fácil sería simplemente cd
en el directorio donde están los archivos:
$ (cd /path/to/file && tar -cf /path/to/example.tar *.xml)
debería funcionar.
Los corchetes agrupan los comandos, por lo que cuando hayan terminado todavía estará en su directorio original. El &&significa el tar
solo se ejecutará si el cd
inicial tuvo éxito.
En uno de tus intentos:
tar -cf example.tar -C /path/to/file "*.xml"
el carácter * se pasa de hecho a tar. Sin embargo, el problema es que tar solo admite coincidencias con comodines en los nombres de los miembros de un archivo. Por lo tanto, si bien puede usar comodines al extraer o enumerar miembros de un archivo, no puede usar comodines cuando está creando un archivo.
En tales situaciones, a menudo recurro a encontrar (como ya mencionaste). Si tiene GNU find, tiene la buena opción de imprimir solo la ruta relativa, usando la opción -printf:
find '/path/to/file' -maxdepth 1 -name '*.xml' -printf '%P\0' \
| tar --null -C '/path/to/file' --files-from=- -cf 'example.tar'
La respuesta aceptada asume que los archivos se toman de un solo directorio. Si usa múltiples -C
opciones, entonces necesita un enfoque más general. El siguiente comando hace que el shell expanda los nombres de los archivos, que luego se pasan a tar .
tar -cf example.tar -C /path/to/file $(cd /path/to/file ; echo *.xml)