
Estoy intentando archivar una carpeta de proyecto con archivos y carpetas ocultos, y obtengo uno con una entrada raíz de .
. Es molesto. Normalmente:
tar -czf $ARCHIVE_NAME -C $DIR .
creará un archivo como
./package.json
./.git
./.gitignore
.
.
.
donde me gustaría que la raíz del archivo fueran los archivos y carpetas reales, sin tener una .
entrada. Como
package.json
.git
.gitignore
.
.
.
¿Cómo puedo hacer eso?
* Editar *
La siguiente imagen puede ser útil para aclarar esta pregunta.
- A la izquierda, un archivo creado con la herramienta GUI del proyecto (de hace dos días).
- A la derecha, un archivo creado con el
tar
comando anterior.
Observe la barra "Ubicación"; el archivo de la derecha debería ser /
, yno /./
.
Respuesta1
./
significa el directorio actual. Sus dos listados son idénticos.
Tener ./
el archivo delante al enumerar el archivo ayuda a manejar archivos con un nombre especial. -file
Se mostrará un nombre de archivo que ./-file
permite que una segunda herramienta lo procese.
Respuesta2
Cambiando tu comando de
tar -czf $ARCHIVE_NAME -C $DIR .
a
tar -czf $ARCHIVE_NAME -C $DIR ./*
debería funcionar. De esta manera, no estará diciendo "Agregar el directorio .
al archivo" sino "Agregar todos estos archivos en el directorio .
al archivo".
Respuesta3
Este comando tar los archivos en el directorio actual sin el encabezado ./
:
tar cf /some/tarfile.tar *
Por supuesto, no incluirá nombres de archivos que comiencen con un punto, que probablemente no sea lo que desea. Puede agregar comodines adicionales para capturarlos:
tar cf /some/tarfile.tar * .[a-zA-Z]*
Pero ésta no es una solución de propósito general; debe saber qué nombres de archivos hay en el directorio para poder crear los comodines apropiados.
GNU tar, que es lo que usan la mayoría de las distribuciones de Linux, tiene una función para transformar nombres de archivos usando sed
expresiones. Esto eliminará los ./
archivos mientras se crea el archivo:
tar cf /some/tarfile.tar --transform 's,^\./,,' .
El archivo resultante todavía tendrá una entrada para "." directorio mismo.
Algunas versiones de tar
pueden leer los nombres de los archivos que se van a tar de un archivo. Puedes explotar esa característica para hacer esto:
ls -a | egrep -v '^\.\.?$' | tar cf - -T /dev/stdin
Esta canalización construye una lista de todos los archivos en el directorio actual, elimina las entradas .
y ..
y canaliza el resto de los nombres a tar
. tar crea el archivo a partir de los nombres de archivo leídos /dev/stdin
(su entrada estándar).