¿Cómo puedo crear un archivo .zip para cada carpeta dentro de otra carpeta?

18

Debajo de la carpeta images\, tengo las siguientes carpetas:

  • Usa\
  • Italy\
  • Japan\

etc.

Quiero un script que crea una .zippara cada una de estas carpetas, por lo que tengo usa.zip, italy.zip, japan.zip.

¿Cómo puedo hacer eso?

Juan claude
fuente

Respuestas:

10

Supongo que esto es Windows, ya que está utilizando barras invertidas.

Obtenga 7za.exe (la versión de línea de comandos de 7-zip ) y póngalo en su %PATH%.

Luego ejecute esto dentro de su Images\directorio:

for /f "tokens=* usebackq" %G in (`dir /b /a:d "%cd%"`) do 7za a -r -tzip "%~G.zip" "%~G"

O en un script por lotes:

for /f "tokens=* usebackq" %%G in (`dir /b /a:d "%cd%"`) do 7za a -r -tzip "%%~G.zip" "%%~G"
paradroid
fuente
Esto no funciona si las carpetas tienen espacios en su nombre.
jiggunjer
@jiggunjer Sí, tienes razón. Lo arreglé para trabajar con espacios en los nombres de las carpetas.
Paradroid
1
Esto funciona incluso con el ejecutable 7zip normal. Actualicé 7za a "C: \ Archivos de programa \ 7-Zip \ 7z.exe" y funcionó sin problemas.
user1324161
8

Suponiendo que esté en Linux, podría usar un script Bash como este:

  #!/bin/bash

  IFS=$'\n'

  for f in $(find "$1" -mindepth 1 -maxdepth 1 -type d ); do
    zip -r "$f" "$f"
  done

Este script tomará el primer argumento como carpeta, en este caso imágenes, y repetirá exactamente un nivel de profundidad para obtener todas sus carpetas (Estados Unidos, Italia y Japón) y comprimirlas en el mismo lugar.

No eliminará los archivos zip antiguos ni las carpetas de origen. Zip es lo suficientemente inteligente como para detectar archivos zip existentes y actualizarlos cuando se ejecutan nuevamente. Sin embargo, si elimina un archivo en las carpetas de origen , no se eliminará en los archivos zip. Puede eludir este comportamiento eliminando los archivos existentes de antemano.

Robert Kühne
fuente
Utilicé el script de Linux que sponiro publicó, y agregué una línea al principio para eliminar carpetas: find $ 1 -type d | xargs rm -rf
generoso
7

Puedes usar Winrar para esto.

Seleccione todas sus carpetas, haga clic derecho y seleccione Add to archive. Ahora seleccione la opción Put each file to separate archivedebajo de la pestaña Files:

ingrese la descripción de la imagen aquí

Haga clic en Aceptar y ya está. Si desea archivos .zip en lugar de .rar, simplemente seleccione ZIPen la Generalpestaña debajo Archive format.

nmat
fuente
0

Esta respuesta por MvG trabajó para mí en Ubuntu:

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 zip y verá los comandos impresos en lugar de ejecutados.

Franck Dernoncourt
fuente