Tengo un solo directorio que contiene docenas de directorios dentro.
Soy nuevo en la línea de comandos y estoy luchando por encontrar un comando que comprima cada subdirectorio en un archivo subdirectorio.zip único.
Entonces, al final, mi directorio principal se llenará con todos mis subdirectorios originales, más el correspondiente .zip
archivos que contienen el contenido comprimido de cada subdirectorio.
¿Es posible algo así? Si es así, muéstrame cómo se hace.
Respuesta aceptada:
Puedes usar este ciclo en bash
:
for i in */; do zip -r "${i%/}.zip" "$i"; done
i
es el nombre de la variable de bucle. */
significa cada subdirectorio del directorio actual e incluirá una barra inclinada final en esos nombres. Asegúrate de cd
al lugar correcto antes de ejecutar esto. "$i"
simplemente nombra ese directorio, incluida la barra inclinada final. Las comillas aseguran que los espacios en blanco en el nombre del directorio no causen problemas. ${i%/}
es como $i
pero con la barra inclinada final eliminada, por lo que puede usarla para construir el nombre del archivo zip.
Si quieres ver cómo funciona esto, incluye un echo
antes del zip
y verá los comandos impresos en lugar de ejecutados.
Ejecución paralela
Para ejecutarlos en paralelo, puede usar &
:
for i in */; do zip -0 -r "${i%/}.zip" "$i" & done; wait
Usamos wait
para indicarle al shell que espere a que finalicen todas las tareas en segundo plano antes de salir.
Tenga en cuenta que si tiene demasiadas carpetas en su directorio actual, puede sobrecargar su computadora, ya que este código no limita la cantidad de tareas paralelas.