¿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

EarthMind
fuente

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.

Juliano
fuente
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)

Christopher Karel
fuente
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.

Philip Reynolds
fuente
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