comando para comprimir múltiples directorios en archivos zip individuales

40

Tengo un solo directorio que contiene docenas de directorios dentro de él.

Soy nuevo en la línea de comandos y estoy luchando por encontrar un comando que comprima cada subdirectorio en un archivo sub-directory.zip único.

Entonces, al final, mi directorio principal se completará con todos mis subdirectorios originales, más los .ziparchivos correspondientes que contienen el contenido comprimido de cada subdirectorio.

¿Es posible algo así? Si es así, muéstrame cómo se hace.

Evster
fuente
Le sugiero que busque cómo se puede hacer "for loops" en el shell. Hay en línea que pueden hacer lo que quieras, pero un buen bucle será mucho más claro.
lynxlynxlynx
Entonces, ¿eso significa que necesito escribir un script de shell separado y luego llamar a ese script desde la línea de comandos? Perdón por una pregunta tan elemental. Aunque tengo algo de experiencia en programación, estas cosas son nuevas para mí.
Evster

Respuestas:

76

Puedes usar este bucle en bash:

for i in */; do zip -r "${i%/}.zip" "$i"; done

ies el nombre de la variable del bucle. */significa cada subdirectorio del directorio actual e incluirá una barra inclinada final en esos nombres. Asegúrese de cdir al lugar correcto antes de ejecutar esto. "$i"simplemente nombra ese directorio, incluida la barra diagonal final. Las comillas aseguran que los espacios en blanco en el nombre del directorio no causen problemas. ${i%/}es como $ipero con la barra diagonal eliminada, por lo que puede usar eso para construir el nombre del archivo zip.

Si desea ver cómo funciona esto, incluya un echoantes del zipy verá los comandos impresos en lugar de ejecutados.

MvG
fuente
Gracias esto se ve genial! Sin embargo, pensé en un problema potencial: ¿esto comprimirá TODOS los directorios dentro de cada subdirectorio en archivos separados? Solo quiero comprimir los subdirectorios de primer nivel como archivos comprimidos individuales. No quiero crear archivos zip adicionales para subdirectorios de segundo nivel, tercer nivel, etc. Por favor, avíseme si eso tiene sentido. ¡Gracias de nuevo!
Evster
Solo los de primer nivel como usted solicitó.
lynxlynxlynx
Los */nombres de cada subdirectorio directo, no todos los directorios descendientes. Por lo tanto, solo obtendrá cremalleras para el nivel superior, tal como lo desea. La versión con echoella habría demostrado ese aspecto. En realidad, comprimir cada directorio anidado en su propio archivo sería más trabajo y probablemente se resolvería mejor utilizando, find -type dentre otros trucos.
MvG
1
@fritzmg: una prueba local en mi Linux sugiere que sí, los archivos que comienzan en un punto están incluidos. Esta sería una propiedad de la herramienta Info-ZIP, no del comando que le di, por lo que dependiendo de cuál sea su zipbinario, podría obtener un comportamiento diferente. Para crear también archivos zip para directorios de nivel superior (es decir, hijos del directorio actual) comenzando con un punto, puede usar shopt -s dotglobpara que los patrones globales también coincidan con los archivos ocultos.
MvG
1
Para crear un archivo zip que no tenga el directorio padre como raíz:for i in */; do (cd "$i"; zip -r "../${i%/}.zip" .); done
chris el