tar -C con un patrón de archivo comodín

17

¿Puedo usar el comando tar para cambiar directorios y usar un patrón de archivo comodín?

Esto es lo que estoy tratando de hacer:

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

Funciona si no cambio el directorio (-C), pero estoy tratando de evitar rutas absolutas en el archivo tar.

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

Estos son algunos de los otros intentos que hice:

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"

Y este es el error que obtengo:

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

Sé que hay otras formas de hacer que esto funcione (usando find, xargs, etc.) pero esperaba hacerlo solo con el comando tar.

¿Algunas ideas?

Nick C.
fuente

Respuestas:

18

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 (tal vez involucrando tuberías) para seleccionar los archivos que desea y luego los alquitrán.

La forma más sencilla sería cdingresar al directorio donde están los archivos:

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

Deberia trabajar.

Los corchetes agrupan los comandos, de modo que cuando hayan terminado, aún estará en su directorio original. El && significa tarque solo se ejecutará si la inicial cdfue exitosa.

Majenko
fuente
9

En uno de tus intentos:

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

el caracter * se pasa de hecho a tar. Sin embargo, el problema es que tar solo admite la coincidencia de comodines con los nombres de los miembros de un archivo. Por lo tanto, aunque 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 buscar (como ya mencionaste). Si tiene GNU find, tiene la buena opción de imprimir solo la ruta relativa, utilizando 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'
gaston
fuente