8 votes

Comment créer un service Automator pour exécuter un script sur tous les fichiers d'un dossier ?

Je souhaite créer un service utilisant Automator pour exécuter un shell script sur tous les fichiers d'un dossier, par exemple supprimer tous les fichiers journaux. Ce que j'ai fait est

  1. Création d'un nouveau service dans automator.
  2. Ajout d'une action "Run Shell script". J'ai remplacé cette action par 'pwd' pour l'instant.
  3. Sélectionner "Le service reçoit les dossiers sélectionnés".
  4. J'ai essayé de l'exécuter, mais j'ai reçu un message. "Pour tester ce service dans Automator, ajoutez l'action "Obtenir les éléments de recherche spécifiés" au début de votre flux de travail. Supprimez ou désactivez l'action avant d'exécuter le flux de travail en dehors d'Automator.
  5. OK. J'ajoute donc "Obtenir les éléments spécifiés du Finder". J'ai ajouté un répertoire 'test' à la liste des éléments.

Maintenant, lorsque j'exécute le script, la fenêtre de résultats affiche mon répertoire personnel.

Ailleurs, j'ai lu qu'il fallait peut-être ajouter

cd "$1"

au début de mon script. J'ai fait cela, mais il imprime toujours mon répertoire personnel. Comment faire pour que ce truc imprime le répertoire que j'ai sélectionné dans "Get Specified Finder Items" ?

Modifié pour ajouter

Voici une capture d'écran d'un script qui fonctionne.

test

Voici une capture d'écran d'un script qui ne fonctionne pas.

enter image description here

La façon habituelle de traiter l'erreur "no match found : *.log" serait de rediriger la sortie d'erreur vers null. En remplaçant la ligne "rm" par

find . -name "*.log" -print0 | xargs -0 rm -rf

Mais cela fonctionne. Cela semble plus difficile qu'il ne devrait l'être.

10voto

user3439894 Points 52496

Si vous créez un Service en utilisant RunShell script à laquelle vous souhaitez transmettre le Dossier(s) à la RunShell script et faire en sorte que des actions supplémentaires se déroulent dans le script sur eux, commencez par ces paramètres.

Créer le service :

  1. Ouvrir Automate et sélectionnez Service o Fichier > Nouveau > Service Si Automate est déjà ouvert.

  2. Set (jeu de mots) Le service reçoit sélectionné à dossiers y en à Recherche .

  3. Ajouter un Exécuter le Shell script Action , réglage Coquille : à /bin/bash y Entrée de passage : à
    comme arguments . Cette opération modifie la valeur par défaut de l'option code à partir de cat à :

     for f in "$@"
     do
         echo "$f"
     done

Vous pouvez maintenant utiliser $f pour agir sur la cible Dossier(s) , par exemple cd $f et vous êtes maintenant dans le répertoire de $f et peut ajouter des code pour agir sur les fichiers/dossiers contenus dans $f , etc.

Mise à jour :

Utiliser les éléments suivants code de travail à titre d'exemple :

for d in "$@"; do
    cd "$d" || exit
    for f in *.log; do 
        [ -f "$f" ] || continue   
        rm "$f"
    done
done

Dans le cadre de la Test y Copie de test dossiers, il y avait un certain nombre de .log et des fichiers portant d'autres extensions. Lorsque le code ci-dessus a été exécuté, il n'a supprimé que les fichiers * .log dans les dossiers cibles, comme le montrent les images ci-dessous, en utilisant deux dossiers ou un seul dossier et des fichiers et des dossiers avec ou sans espaces dans leurs noms.

Remarque : Les captures d'écran ci-dessous ne contiennent pas le traitement des erreurs qui a été ajouté à la exemple shell script code par commentaire à cette réponse.


enter image description here


enter image description here

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