3 votes

Créer un fichier zip à l'aide d'un service Automator

J'essaie de créer un service dans Automator sous Mac OS X Mountain Lion. La commande que je veux utiliser est la suivante :

zip zip-file.zip "$@"

Et voici une capture d'écran de ce que j'ai fait :

enter image description here

Cela fonctionne. Mais deux problèmes :

  1. zip-file.zip est placé dans mon répertoire personnel ~\ . Je veux placer le fichier zip à l'endroit où se trouvent les fichiers originaux.

  2. zip-file.zip contient la structure du dossier des fichiers spécifiés en commençant par la racine. Je veux inclure uniquement les fichiers, ou seulement ceux du répertoire parent le plus proche.

Que dois-je faire ?

4voto

Nader Shirazie Points 8494

Pourquoi ne pas utiliser l'action Créer une archive plutôt qu'un script shell ?

J'en ai créé un rapide qui comporte quatre étapes.

  1. sélectionne un dossier (Demande d'éléments du Finder - Dossiers uniquement)
  2. sélectionne les fichiers (Get Folder Contents)
  3. filtre les éléments pour ne sélectionner aucun sous-dossier (Filter Finder Items)
  4. transmettre les fichiers à l'action Créer une archive

enter image description here

1voto

lycono Points 801

Je n'utilise pas Automator, mais j'ai une solution que j'utilise pour zipper les fichiers. Mettez le nom de votre fichier souhaité et le mot de passe au début du script et exportez comme une application. Glissez et déposez vos fichiers dans l'icône de la droplet et voilà une archive zip est créée dans le même dossier que les fichiers originaux.

on open theItems

    set passwd to "yourPassword"
    set archiveName to "yourArchive"

    tell application "Finder"
            if theItems's length > 1 then
                    set fileName to archiveName & ".zip"
            else
                    set fileName to name of item 1 of theItems & ".zip"
            end if
            --remove existing archive file with same filename
            try
                    set archiveFile to ((container of (item 1 of theItems) as Unicode text) & fileName)
                    if exists file archiveFile then
                            delete file archiveFile
                    end if
            end try
    end tell

    repeat with thisItem in theItems
            set itemPath to quoted form of (POSIX path of thisItem)
            tell application "Finder"
                    set parentFolder to POSIX path of (container of thisItem as alias)
            end tell
            set zipFile to quoted form of (parentFolder & fileName)
            set cmd to "zip -P " & passwd & " -rj " & zipFile & " " & itemPath & " -x *.DS_Store"
            do shell script cmd
    end repeat

end open

1voto

J'ai pu modifier le shell script pour obtenir les résultats souhaités, avec l'aide de https://stackoverflow.com/questions/12340846/bash-shell-script-pour-trouver-le-parent-le-directeur-de-plusieurs-fichiers/12341334#12341334

enter image description here

declare -a names
declare -a parts
declare i=0

names=("$@")
name="$1"
while x=$(dirname "$name"); [ "$x" != "/" ]
do
    parts[$i]="$x"
    i=$(($i + 1))
    name="$x"
done

for prefix in "${parts[@]}" /
do
for name in "${names[@]}"
    do
        if [ "${name#$prefix/}" = "${name}" ]
            then continue 2
        fi
    done
    dir="$prefix"
    break
done

cd "$dir"

for file in "${names[@]}"
do
    zip zip-file.zip -r "${file#$dir/}" -x *.DS_Store
done

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X