Compressez par lots plusieurs dossiers en fichiers zip individuels

12

J'ai des dizaines de dossiers que je dois compresser en fichiers zip individuels.

Si je sélectionne tous ces dossiers dans le Finder et que je "compresse les éléments [X]", j'obtiens un fichier zip contenant tous les dossiers, alors que je veux un fichier zip par dossier.

J'ai essayé de créer un flux de travail avec Automator en utilisant l'action "Créer une archive", mais cela se comporte de la même manière: la saisie de plusieurs fichiers / dossiers génère un seul fichier zip. Il n'y a aucun moyen de spécifier que l'action s'exécute sur chaque élément individuellement.

Fondamentalement, je cherche un moyen d'éviter d'exécuter fastidieusement "Compress" dans le Finder sur chaque dossier un par un. Existe-t-il un moyen d'automatiser cela?

daGUY
la source
1
J'ai mis à jour ma réponse pour améliorer le code utilisé pour incrémenter le nom de fichier de l'archive zip afin qu'il émule la façon dont la commande Compress [n] Items du menu contextuel du Finder incrémente un nom de fichier.
user3439894
Désolé, j'ai à nouveau mis à jour le code pour supprimer l'inutile popdet corrigé une faute de frappe fatale for i in $bn*.zip; do, qui aurait dû l'être for i in $bn *.zip; do. Notez l'espace entre $bnet *.zip, il manquait et n'aurait pas dû l'être. Veuillez donc le mettre à jour dans votre implémentation, sinon il se mettra en marche File Name 2.ziplorsque le basenameaura un espace dedans.
user3439894

Réponses:

14

Voici un service Automator 1 qui devient disponible dans le Finder lorsque les dossiers sont sélectionnés et émule la commande Compress [n] Items des menus contextuels, sauf qu'il crée un fichier d'archive zip individuel pour chaque dossier sélectionné au nom du dossier sélectionné . Si le fichier Folder Name.zip existe déjà, un ( espace 2) est ajouté au nom de fichier , par exemple Folder Name 2.zip . Cela garantit un fichier d'archive zip existant " 2"n'est pas touché et le nom de fichier de l'archive zip sera automatiquement incrémenté si nécessaire.

1 Dans macOS Mojave et versions ultérieures, un service Automator est appelé une action rapide . Il existe également d'autres différences mineures de nomenclature, mais elles devraient être plus évidentes lors de leur comparaison avec les flux de travail pré-macOS Mojave Automator.

Pour créer le service: 1

  1. Ouvrez Automator et sélectionnez Service 1 ou Fichier > Nouveau > Service si Automator est déjà ouvert.

  2. Set Service reçoit la sélection des dossiers et dans le Finder .

  3. Ajoutez une action d' exécution de script shell , définissez Shell: sur / bin / bash et passez l'entrée: à en tant qu'arguments et ajoutez le code suivant :

    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. Enregistrez le service sous: compresser les dossiers séparément

Pour utiliser le service:

Dans le Finder ou sur le bureau, sélectionnez plusieurs dossiers , puis cliquez avec le bouton droit et sélectionnez Compresser les dossiers séparément sous Services .

Ou après avoir sélectionné les dossiers cibles , vous pouvez également cliquer sur Finder > Services > Compresser les dossiers séparément dans la barre de menus .

Voilà, un moyen de compresser plusieurs dossiers séparément et simultanément à la fois dans des archives zip individuelles tout en émulant la façon dont le Finder crée un fichier d'archive zip. Cela signifie que l'archive zip contient des fourchettes de ressources préservées et des métadonnées HFS dans le sous-répertoire __MACOSX et incorpore uniquement la source du nom du répertoire parent dans l' archive de destination , pas le nom de chemin complet comme lors de l'utilisation zip(sans -j) pour créer l'archive.

Image des dossiers compressés séparément

Compresser les dossiers séparément - Service Automator

user3439894
la source
J'ai vérifié à la fois votre solution et @ ababak. Ils donnent exactement le même résultat et ababak est beaucoup plus facile à mettre en œuvre. J'ai de toute façon voté pour les deux.
turzifer
15

Il existe une solution alternative intégrée si vous ne souhaitez pas utiliser Automator et que vous pouvez modifier les paramètres de l'utilitaire d'archivage.

  1. Ouvrez Archive Utility.app situé dans / System / Library / CoreServices / Applications /
  2. Allez dans Fichier> Préférences
  3. Modifiez la préférence "Utiliser le format d'archive" en "Archive zip"
  4. Faites glisser et déposez les dossiers dans son icône dans le dock.
ababak
la source
la bonne chose à propos de cette option est que vous pouvez définir les préférences Archive Utility.app pour déplacer l'original dans la corbeille une fois terminé, il n'est pas limité aux dossiers. Existe-t-il un moyen de configurer un service Automator à ouvrir avec Archive Utility.app en tant que service si vous souhaitez cliquer avec le bouton droit de la souris en option? J'ai rencontré une limitation car Archive Utility.app ne peut pas être sélectionné à l'aide de l'action Lancer l'application.
thepen
@thepen, bien sûr, vous pouvez sélectionner Archive Utility comme Action de lancement de l'application. Il vous suffit de sélectionner «Autre…» et de naviguer jusqu'à son emplacement /System/Library/CoreServices/Applications/(vous pouvez appuyer sur Cmd-Shift-G lorsque la boîte de dialogue de sélection de fichier est ouverte pour coller ce chemin pour une navigation rapide)
ababak
quelle est la différence entre «format d'archive» et «archive zip»?
user1993
Cette méthode est un flux de travail beaucoup plus facile. J'ai essayé la commande: pour l'élément dans *; do zip "$ {item} .zip" "$ {item}"; fait dans le terminal mais cela n'a pas fonctionné correctement. Je ne sais pas pourquoi, mais je ne voulais pas prendre le temps de le comprendre. Cela a très bien fonctionné.
ArchonOSX