error tar al incluir un archivo dot

error tar al incluir un archivo dot

Necesito tar algunos archivos, uno de los cuales es un archivo de puntos.

FILE1=/tmp/foo/.env
FILE2=/tmp/foo/docker-compose.yml

FILES="${FILE1#/} ${FILE2#/}"

tar -C / -cf /tmp/foo/files.tar "$FILES"

La sustitución de variables evita la tar: Removing leading '/' from member namesadvertencia y simplifica el desmarcado.

Pero me sale este error:

tar: tmp/foo/.env tmp/foo/docker-compose.yml: No se puede establecer: No existe tal archivo o directorio

Codificar las rutas funciona: tar -C / -cf /tmp/foo/files.tar tmp/foo/.env tmp/foo/docker-compose.yml.

Entonces, ¿supongo que el problema está en el manejo de ese archivo de puntos o en algo que tiene que ver con escapar?

Respuesta1

Cuando el caparazón se expande "$FILES", el espacio pierde su valor sintáctico. Entonces el tarcomando recibe tmp/foo/.env tmp/foo/docker-compose.ymlcomo una única ruta.

Tal como

file='a b'
touch "$file"

creará un archivo a b, no dos archivos ay b.

Entonces, como se sugiere en el comentario, debes usar diferentes variables para diferentes archivos: tar -C / -cf /tmp/foo/files.tar "${FILE1#/}" "${FILE2#/}".


El hecho de que la ejecución directa tar -C / -cf /tmp/foo/files.tar tmp/foo/.env tmp/foo/docker-compose.ymlfuncione se debe a que los espacios tienen valor sintáctico allí, separando un argumento de otro. Para los "ojos humanos", se producirá el mismo espacio después de la expansión de "$FILES"to tmp/foo/.env tmp/foo/docker-compose.yml, pero en este caso el espacio no tiene un significado especial debido a las comillas, por lo que todo el valor se tratará como una única ruta.

información relacionada