3 votos

El AppleScript para comprimir carpetas hace cosas inesperadas

He compilado el siguiente script para comprimir varias carpetas sólo con su contenido.

( Así, por ejemplo, la carpeta X que contiene los archivos A, B y C formará un archivo zip que contiene A, B y C y no la carpeta X como padre. )

on run {input, parameters}

    tell application "Finder"
        set theItems to selection
        repeat with i from 1 to (count of theItems)
            set theItem to (item i of theItems) as alias
            set itemPath to quoted form of POSIX path of theItem
            set fileName to name of theItem
            set theFolder to POSIX path of (container of theItem as alias)
            set zipFile to quoted form of (theFolder & fileName & ".zip")
            do shell script "zip -jr " & zipFile & " " & itemPath
            delete (item i of theItems)
        end repeat
    end tell

    return input

end run

Al probarlo con una simple carpeta y unos cuantos archivos al azar, el script funciona bien. Pero cuando la carpeta contiene muchos archivos, aparece el siguiente error:

'advertencia de zip: primer nombre completo: /Usuarios/laurens/Escritorio/Carpeta de pruebas/.DS_Store segundo nombre completo: /Usuarios/laurens/Escritorio/Carpeta de pruebas/.DS_Store el nombre en el archivo zip se repite: .DS_Store esto puede ser el resultado de usar -j

error de cremallera: Argumentos de comando no válidos (no se pueden repetir nombres en el archivo archivo)'

enter image description here

He comprobado la misma carpeta en Windows (a través de Parallels), y no veo ningún archivo .DS_Store, tampoco estoy seguro de por qué el script hace referencia a esos archivos en lugar de a las carpetas...

No sé qué pensar de esto.

4voto

Phill Puntos 126

El motivo del error es que zip intenta comprimir los archivos almacenando únicamente sus nombres, tal y como se especifica en el -j (de man zip ):

Almacena sólo el nombre de un archivo guardado (no la ruta), y no almacena los nombres de los directorios.

pero hay dos archivos con el mismo nombre ( .DS_Store ):

  • ~/Test folder/.DS_Store
  • ~/Test folder/story_content/.DS_Store

Desde zip no puede almacenar la misma entrada dos veces, lanza un error y aborta.

Para solucionarlo, hay que excluir .DS_Store archivos del archivo zip:

on run {input, parameters}

    tell application "Finder"
        set theItems to selection
        repeat with i from 1 to (count of theItems)
            set theItem to (item i of theItems) as alias
            set itemPath to quoted form of POSIX path of theItem
            set fileName to name of theItem
            set theFolder to POSIX path of (container of theItem as alias)
            set zipFile to quoted form of (theFolder & fileName & ".zip")
            --
            -- Exclude files named .DS_Store
            do shell script "zip -jr " & zipFile & " " & itemPath & " -x \\*.DS_Store"
            --
            --
            delete (item i of theItems)
        end repeat
    end tell

    return input

end run

En el código anterior, utilizo -x para instruir zip para excluir .DS_Store al crear un archivo zip. Como esto evita que los nombres de archivo duplicados sean seleccionados para la compresión, el cannot repeat names in zip file' el error no se produce.

Tenga en cuenta que si utiliza el -x cuando se ejecuta zip en el Terminal, sólo necesita una barra invertida:

zip -jr file.zip files -x \*.DS_Store

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X