¿Linux gzip múltiples subdirectorios en archivos separados?


16

¿Cómo podría comprimir subdirectorios en archivos separados?

Ejemplo:

directory
 subdir1
 subdir2

Debería crear subdir1 (.tar) .gz y subdir2 (.tar) .gz

Respuestas:


27

Este pequeño script parece ser su mejor opción, dados sus requisitos:

cd directory
for dir in */
do
  base=$(basename "$dir")
  tar -czf "${base}.tar.gz" "$dir"
done

Maneja correctamente directorios con espacios en sus nombres.


Me da este error: bash: -c: línea 1: error de sintaxis: final inesperado del archivo
— EarthMind

@EarthMind: Funciona bien aquí. Compruebe si la secuencia de comandos se copió correctamente.
— Juliano

@EarthMind: No estoy seguro de que haya explicado bien la pregunta original, entonces. ¿Desea ejecutar esto nuevamente y obtener nuevos archivos .tar.gz mientras deja solos los archivos .tar.gz anteriores? Intente agregar "tmstamp = $ (date '+% Y% m% d-% H% M')" y cambie $ {base} a $ {base} - $ {tmstamp}.
— freiheit

2
@EarthMind: si va a poner todo en una línea, asegúrese de que haya un punto y coma (;) justo antes del comando tar. De lo contrario, la base se pasa como una variable de entorno a tar, en lugar de ser una variable auxiliar de shell.
— Juliano

@mwojtera tu intento de edición debería ser su propia respuesta
— chicas

10

Qué tal esto: find * -maxdepth 0 -type d -exec tar czvf {}.tar.gz {} \;

Explicación: ejecuta una búsqueda en todos los elementos del directorio actual. Maxdepth 0 hace que no se repita más bajo que los argumentos dados. (En este caso *, o todos los elementos en su directorio actual) El argumento 'd' para "-type" solo coincide con los directorios. Entonces exec ejecuta tar en cualquier partido. ({} se reemplaza por el archivo correspondiente)


1
Pero sigo teniendo el error de que la ruta dada es un directorio y no un archivo
— EarthMind

3
gzip solo no archiva directorios
— Juliano

Necesita tar directorios antes de poder comprimirlos.
— phaphink

1
Necesita tar con la opción z, no gzip directo para directorios. Muy buen uso de find, sin embargo.
— freiheit

3
Error: "find: las rutas deben preceder a la expresión:;" La primera parte funciona, así que usé (solo directorios): for dir in `find * -maxdepth 0 -type d`; do tar -cvzf ${dir}.tar.gz ${dir}; done
— JosephK

4

Esto creará un archivo llamado blah.tar.gz para cada archivo en un directorio llamado blah.

$ cd directory
$ for dir in `ls`; do tar -cvzf ${dir}.tar.gz ${dir}; done

Si tiene más que simplemente directorios en el directorio (es decir, archivos también, ya que ls devolverá todo en el directorio), use esto:

$ cd directory
$ for dir in `find . -maxdepth 1 -type d  | grep -v "^\.$" `; do tar -cvzf ${dir}.tar.gz ${dir}; done

El grep -v excluye el directorio actual que se mostrará en el findcomando por defecto.


3
Tanto ls como find NO fueron hechos para usarse de esta manera. Especialmente ls, está destinado a presentar archivos en una lista legible por el usuario, no a generar listas de archivos como argumentos para 'for'. Solo usefor dir in *
— Juliano

1
He intentado su primera sugerencia, pero no funciona con directorios que contienen espacios en su nombre
— EarthMind

Además, el primer comando también creará un tarball para cada archivo en el directorio.
— phaphink
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.