¿Cómo elimino la ruta completa al realizar una compresión tar.gz?

¿Cómo elimino la ruta completa al realizar una compresión tar.gz?

Estoy usando este comando para archivar un directorio nombrado gen 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/gy luego todos los archivos de la gcarpeta que contiene. Pero sólo quiero ver los archivos de la carpeta gen 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 -Copción hace tarcambiar el directorio de trabajo, por lo que solo necesitas agregar ..

Ver:Cambiar el directorio de trabajo – tarmanual GNU

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_dirvariable apunta a su directorio de interés y desea tar y comprimir (usando gzip) todos sus *.txtarchivos 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-fromla opción posterior que lea nombres terminados en nulo. Recuerde que solicitamos findcrear salidas terminadas en nulo ( ) en lugar de salidas terminadas \0normales . \nEsto 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 que tarahora 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 --nullopción indica tarque los nombres en FILEestén separados por el carácter ASCII NULL, en lugar del avance de línea ( \n). También decimos que FILEes stdin(canalizado finddirectamente desde un disco taren lugar de leerlo ). FILEIgual 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 -to --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 vopció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 -

información relacionada