
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 names
advertencia 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 tar
comando recibe tmp/foo/.env tmp/foo/docker-compose.yml
como una única ruta.
Tal como
file='a b'
touch "$file"
creará un archivo a b
, no dos archivos a
y 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.yml
funcione 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.