Pregunta Linux gzip múltiples subdirectorios en archivos separados?


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

Ejemplo:

directory
 subdir1
 subdir2

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


13
2017-12-28 17:51


origen




Respuestas:


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 adecuadamente los directorios con espacios en sus nombres.


21
2017-12-28 18:32



Me da este error: bash: -c: línea 1: error de sintaxis: final de archivo inesperado - EarthMind
@EarthMind: Funciona bien aquí. Compruebe si el script se copió correctamente. - Juliano
@EarthMind: No estoy seguro de que hayas explicado bien la pregunta original, entonces. ¿Desea ejecutar esto nuevamente y obtener nuevos archivos .tar.gz mientras deja los archivos anteriores .tar.gz solo? Intente agregar "tmstamp = $ (fecha '+% Y% m% d-% H% M')" y cambie $ {base} a $ {base} - $ {tmstamp}. - freiheit
@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 - chicks


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

Explicación: Usted ejecuta una búsqueda en todos los elementos en el directorio actual. Maxdepth 0 hace que no sea inferior a los argumentos dados. (En este caso *, o todos los elementos de su directorio actual) El argumento 'd' para escribir solo coincide con los directorios. Luego exec ejecuta tar en cualquier coincidencia. ({} es reemplazado por el archivo correspondiente)


7
2017-12-28 17:56



Pero luego sigo recibiendo el error de que la ruta dada es un directorio y no un archivo - EarthMind
gzip solo no archiva directorios - Juliano
Necesita tar directorios antes de poder gzip ellos. - ℝaphink
Necesita tar con la opción z, no gzip directo para directorios. Muy buen uso de encontrar, sin embargo. - freiheit
Error: "buscar: las rutas deben preceder a la expresión:;" La primera parte funciona, así que utilicé (solo directorios): for dir in `find * -maxdepth 0 -type d`; do tar -cvzf ${dir}.tar.gz ${dir}; done - JosephK


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

La grep -v excluye el directorio actual que aparecerá en el find comando por defecto.


4
2017-12-28 18:08



Tanto ls como el hallazgo NO fueron hechos para ser utilizados de esta manera. Especialmente ls, está pensado para presentar archivos en una lista legible por el usuario, no para generar listas de archivos como argumentos para 'for'. Solo usa for dir in * - Juliano
He probado tu primera sugerencia pero no funciona con directorios que contengan espacios en su nombre - EarthMind
Además, el primer comando también creará un tarball para cada archivo en el directorio. - ℝaphink