Lote comprima varias carpetas en archivos zip individuales

12

Tengo docenas de carpetas que necesito comprimir en archivos zip individuales.

Si selecciono todas estas carpetas en el Finder y hago "Comprimir elementos [X]", obtengo un archivo zip que contiene todas las carpetas, mientras que lo que quiero es un archivo zip por carpeta.

Intenté crear un flujo de trabajo con Automator usando la acción "Crear archivo", pero se comporta de la misma manera: al ingresar múltiples archivos / carpetas se genera un único archivo zip. No hay forma de especificar que la acción se ejecute en cada elemento individualmente.

Básicamente, estoy buscando una manera de evitar tener que ejecutar tediosamente "Comprimir" en el Finder en cada carpeta de una en una. ¿Hay alguna forma de automatizar esto?

daGUY
fuente
1
Actualicé mi respuesta para mejorar el código utilizado para incrementar el nombre del archivo zip para que emule cómo el comando del menú contextual Finder Comprimir [n] Elementos incrementa un nombre de archivo.
user3439894
Lo siento, actualicé el código una vez más para eliminar el innecesario popdy corrigí un error tipográfico fatal for i in $bn*.zip; do, que debería haber sido for i in $bn *.zip; do. Tenga en cuenta el espacio entre $bny *.zip, faltaba y no debería haberlo estado. Así que actualícelo en su implementación; de lo contrario, se iniciará File Name 2.zipcuando basenametenga un espacio.
user3439894

Respuestas:

14

Aquí hay un Servicio 1 de Automator que está disponible en Finder cuando se seleccionan Carpetas y emula el comando Comprimir [n] Elementos de los menús contextuales, excepto que crea un archivo comprimido individual para cada Carpeta seleccionada en el nombre de la Carpeta seleccionada . Si el archivo Folder Name.zip ya existe, se agrega un ( espacio 2) al nombre del archivo , por ejemplo, Folder Name 2.zip . Esto asegura un archivo comprimido existente " 2"no se toca y el nombre del archivo comprimido se incrementará automáticamente según sea necesario.

1 En macOS Mojave , y más tarde, un Servicio Automator se llama Acción Rápida . También hay otras diferencias menores de nomenclatura, pero deberían ser más obvias cuando se comparan con los flujos de trabajo de Mojave Automator anteriores a macOS.

Para crear el servicio: 1

  1. Abra Automator y seleccione Servicio 1 o Archivo > Nuevo > Servicio si Automator ya está abierto.

  2. Conjunto de servicios recibe seleccionada a carpetas y en al Buscador .

  3. Agregue una acción Ejecutar script de Shell , establezca Shell: en / bin / bash y Pass input: to como argumentos y agregue el siguiente código :

    for f in "$@"; do
    
        dn="$(dirname "$f")"
        bn="$(basename "$f")"
    
        cd "$dn" || exit
    
        if [[ ! -e "$bn.zip" ]]; then
            ditto -c -k --sequesterRsrc --keepParent "$f" "$bn.zip"
        else
            n=2
            for i in $bn *.zip; do
                if [[ "$bn $n.zip" == "$i" ]]; then
                    n="$(( n + 1 ))"
                fi
            done
            ditto -c -k --sequesterRsrc --keepParent "$f" "$bn $n.zip"
        fi
    
    done
    
    afplay /System/Library/Sounds/Purr.aiff
  4. Guarde el servicio como: Comprimir carpetas por separado

Para usar el servicio:

En Finder o en el escritorio, seleccione varias carpetas , luego haga clic con el botón derecho y seleccione Comprimir carpetas por separado en Servicios .

O, después de seleccionar las carpetas de destino , también puede hacer clic en Finder > Servicios > Comprimir carpetas por separado desde la barra de menú .

Ahí lo tiene, una forma de comprimir varias carpetas por separado y simultáneamente a la vez en archivos zip individuales mientras emula cómo Finder crea un archivo zip. Es decir, el archivo zip contiene bifurcaciones de recursos conservados y HFS meta-datos en el subdirectorio __MACOSX e incrusta sólo el nombre de directorio principal fuente de destino de archivado , no el nombre de ruta completamente calificado como cuando se utiliza zip(sin -j) para crear el archivo.

Imagen de carpetas de compresión por separado

Comprimir carpetas por separado - Servicio de automatización

usuario3439894
fuente
Verifiqué tanto tu solución como la de @ ababak. Dan exactamente el mismo resultado y ababak's es mucho más fácil de implementar. Yo voté los dos de todos modos.
turzifer
15

Hay una solución alternativa incorporada si no desea utilizar Automator y está de acuerdo con cambiar la configuración de Archive Utility.

  1. Abra el archivo Utility.app ubicado en / System / Library / CoreServices / Applications /
  2. Vaya a Archivo> Preferencias
  3. Cambie la preferencia "Usar formato de archivo" a "Archivo zip"
  4. Arrastre y suelte las carpetas en su icono en el dock.
ababak
fuente
Lo bueno de esta opción es que puede configurar las preferencias de Archive Utility.app para mover el original a la papelera después de que finalice, no se limita a las carpetas. ¿Hay alguna manera de configurar un servicio Automator para abrir con Archive Utility.app como servicio si desea hacer clic derecho como una opción? Me encontré con una limitación, ya que Archive Utility.app no ​​se puede seleccionar usando la acción Iniciar aplicación.
thepen
@thepen, por supuesto, puede seleccionar la Utilidad de archivo como Acción de lanzamiento de la aplicación. Solo necesita seleccionar "Otro ..." y navegar a su ubicación que es /System/Library/CoreServices/Applications/(puede presionar Cmd-Shift-G cuando el cuadro de diálogo de selección de archivo está abierto para pegar esta ruta para una navegación rápida)
ababak
¿Cuál es la diferencia entre 'formato de archivo' y 'archivo zip'?
user1993
Este método es un flujo de trabajo mucho más fácil. Intenté el comando: para el elemento en *; do zip "$ {item} .zip" "$ {item}"; hecho en la terminal pero no funcionó bien. No sabía por qué, pero no quería tomarme el tiempo para resolverlo. Esto funcionó bien.
ArchonOSX