
Estoy usando este comando para archivar un directorio nombrado g
en código Java:
tar czf /a/b/c.tar.gz /e/f/g
Cuando se crea el archivo tar c.tar.gz
, encuentro una ruta completa e/f/g
y luego todos los archivos de la g
carpeta que contiene. Pero sólo quiero ver los archivos de la carpeta g
en el archivo comprimido cuando lo abro. ¿Cómo elimino las carpetas /e/f/
del archivo .tar.gz?
Respuesta1
tar -czf /a/b/c.tar.gz -C /e/f/g .
La -C
opción hace tar
cambiar el directorio de trabajo, por lo que solo necesitas agregar .
.
Respuesta2
Esta pregunta es de hace un tiempo, pero todavía no pude encontrar la respuesta fácilmente para agregar archivos y carpetas con criterios de búsqueda específicos con rutas relativas.
Lo siguiente cubre un tema más amplio que lo que se ha preguntado. Entonces, estoy escribiendo la solución que se me ocurrió después de mi investigación.
Supongamos que su $input_dir
variable apunta a su directorio de interés y desea tar y comprimir (usando gzip) todos sus *.txt
archivos en formato ~/my_txt.tar.gz
. Para crear un tarball comprimido con gzip sin ruta almacenada en el tar (ruta relativa), use lo siguiente:
find "$input_dir" -maxdepth 1 -type f -name "*.txt" -printf "%P\0" | tar --null --create --remove-files --gzip --file="$HOME/my_txt.tar.gz" --directory="$input_dir" --files-from=-
Vamos a desglosarlo:
"$input_dir"
: el directorio del punto de partida. Cámbialo a lo que quieras.maxdepth 1
: solo busca en la raíz de ese directorio. Puedes eliminarlo o modificarlo si quieres buscar en todos o en diferentes niveles.-type f
: buscar solo archivos-name "*.txt"
: coincide con los criterios *.txt-printf "%P"
: genera la ruta relativa (página de manual: "Nombre del archivo con el nombre del punto de partida bajo el cual se encontró eliminado").-printf "%P\0"
: nulo termina las salidas de ruta relativa| tar
: canaliza las salidas al siguiente comando que aquí es tar--null
: indica a--files-from
la opción posterior que lea nombres terminados en nulo. Recuerde que solicitamosfind
crear salidas terminadas en nulo ( ) en lugar de salidas terminadas\0
normales .\n
Esto es para cubrir todos los nombres de archivos posibles con espacios u otros caracteres especiales.--create
: crea el archivo tar. Igual a-c
.--remove-files
: Utilizo esta opción para eliminar los archivos después de agregarlos al tarball. Puedes dejarlo.--gzip
: comprime el tarball. Igual a-z
.--file="$HOME/my_txt.tar.gz"
: El archivo tarball comprimido con gzip de salida. Igual a-f "$HOME/my_txt.tar.gz"
--directory="$input_dir"
: Esto significa quetar
ahora cambia a este directorio. Ahora buscará los nombres de archivos que se pasan en este directorio (recuerde que hemos creado la ruta relativa de los nombres de archivos a esta carpeta). Igual a-C "$input_dir"
.--files-from=/dev/stdin
: Su forma general es--files-from=FILE
. Esta opción con la--null
opción indicatar
que los nombres enFILE
estén separados por el carácter ASCII NULL, en lugar del avance de línea (\n
). También decimos queFILE
esstdin
(canalizadofind
directamente desde un discotar
en lugar de leerlo ).FILE
Igual a-T -
.
Algunas de las opciones anteriores se pueden cambiar a opciones de un carácter y se pueden combinar.
find "$input_dir" -maxdepth 1 -type f -name "*.txt" -printf "%P\0" | tar --null --remove-files -czf "$HOME/my_txt.tar.gz" -C "$input_dir" -T -
Puede consultar la lista de archivos usando la opción -t
o --list
:
tar -tf "$HOME/my_txt.tar.gz"
Ahora, para extraer los archivos al directorio $output_dir (que existe), use esto:
tar -xvzf "$HOME/my_txt.tar.gz" -C "$output_dir"
La v
opción es detallada y también puedes agregarla durante la creación del archivo tar.
Respuesta3
La respuesta de slhck no permite filtrar qué archivos queremos e incluye todo el directorio, y el shell global no funcionará con esta opción de directorio (consulte este problema que se describe aquí:Cómo hacer que tar globbing funcione con la opción 'cambiar directorio').
La respuesta de shaheen g es excelente, pero los bytes nulos me impidieron usar el comando en un lenguaje de programación porque los bytes nulos están prohibidos en una cadena. Así que lo adapté para que funcione sin bytes nulos cuando no necesitas manejar nombres de archivos con espacios en blanco, respondeaquí.
tar -czf /a/b/c.tar.gz -C /e/f/g $(find /e/f/g -maxdepth 1 -type f -name "*.txt" -printf "%f\n")
o
find /e/f/g -maxdepth 1 -type f -name "*.txt" -printf "%f\n" | tar -czf /a/b/c.tar.gz -C /e/f/g -T -