# Aide pour script Applescript de recherche particulière



## PO_ (15 Septembre 2015)

Bonjour, 

J'aimerais savoir si quelqu'un pourrait me donner un petit coup de main afin de me confectionner un petit script de recherche un peu particulier : 

J'ai pas mal (plusieurs centaines) de dossiers, et j'aimerais pouvoir trouver ceux qui ne contiennent pas de fichier pdf.

En fait, il s'agit de ma bibliothèque numérique. J'ai 26 dossiers nommés A, B, C, ...jusqu'à Z
Dans chacun de ces dossiers, il y a plusieurs dizaines de dossiers correspondant chacun à un ouvrage, et contenant chacun un fichier ePub, et éventuellement le PDF correspondant.

J'aimerais qu'en étant sur le dossier "A", par exemple, cela recherche tous les dossiers contenus dans "A" et qui n'ont pas de fichiers pdf.

J'espère que quelqu'un pourra m'aider, et je vous remercie d'avance.


----------



## JacqR (15 Septembre 2015)

Bonjour,

Voici un script AppleScript qui fait cela :

```
property dossiers : missing value
set dossiers to {}
getsubfoldersWithoutPDF(choose folder with prompt "Sélectionnez le dossier où vous voulez recherchez des dossiers sans PDF")
dossiers

on getsubfoldersWithoutPDF(f)
    tell application "System Events"
        repeat with i in (get folders of f)
            set thisSubf to contents of i
            if (files of thisSubf whose name extension is "pdf") is {} then set end of dossiers to POSIX path of thisSubf
            my getsubfoldersWithoutPDF(thisSubf)
        end repeat
    end tell
end getsubfoldersWithoutPDF
```

Ce script retourne une liste de chemins.
Si voulez une liste de noms, remplacer "*set end of dossiers to POSIX path of thisSubf*" par "set end of dossiers to name of thisSubf"


----------



## PO_ (16 Septembre 2015)

Je te remercie infiniment. 

Je vais tester de suite


----------



## PO_ (16 Septembre 2015)

Je te remercie infiniment, cela fonctionne parfaitement. J'ai fais le remplacement suggéré. 

Seulement, cela me donne une liste. Je pourrais éventuellement l'insérer dans un traitement de texte et effectuer un rechercher-remplacer de toutes les virgules pour avoir une liste plus lisible. 

Mais, y aurait-il un moyen que cela m'ouvre une fenêtre de finder ne contenant que les dossiers en question, un peut comme ce que l'on obtient lorsque l'on fait un Commande-F et que l'on spécifie des arguments. 

Je sais que j'abuse un peu, mais cela me ferait gagner un temps considérable car j'ai plus de 10 000 dossier à traiter


----------



## JacqR (16 Septembre 2015)

Bonjour,



PO_ a dit:


> Je te remercie infiniment, cela fonctionne parfaitement. J'ai fais le remplacement suggéré.
> 
> Seulement, cela me donne une liste. Je pourrais éventuellement l'insérer dans un traitement de texte et effectuer un rechercher-remplacer de toutes les virgules pour avoir une liste plus lisible.


Pour convertir la liste en texte (un dossier par ligne), voici le script qui affiche le texte dans un nouveau document "TextEdit" :

```
property dossiers : missing value
set dossiers to {}
getsubfoldersWithoutPDF(choose folder with prompt "Sélectionnez le dossier où vous voulez recherchez des dossiers sans PDF")
set text item delimiters to return
set dossiers to dossiers as string
set text item delimiters to ""
tell application "TextEdit"
    make new document with properties {text:dossiers}
    activate
end tell

on getsubfoldersWithoutPDF(f)
    tell application "System Events"
        repeat with i in (get folders of f)
            set thisSubf to contents of i
            if (files of thisSubf whose name extension is "pdf") is {} then set end of dossiers to POSIX path of thisSubf
            my getsubfoldersWithoutPDF(thisSubf)
        end repeat
    end tell
end getsubfoldersWithoutPDF
```


-----------
Si vous préferez que le texte soit dans le presse-papiers :

```
property dossiers : missing value
set dossiers to {}
getsubfoldersWithoutPDF(choose folder with prompt "Sélectionnez le dossier où vous voulez recherchez des dossiers sans PDF")
set text item delimiters to return
set dossiers to dossiers as string
set text item delimiters to ""
set the clipboard to dossiers
display alert "Les chemins des dossiers sont dans le presse-papiers"

on getsubfoldersWithoutPDF(f)
    tell application "System Events"
        repeat with i in (get folders of f)
            set thisSubf to contents of i
            if (files of thisSubf whose name extension is "pdf") is {} then set end of dossiers to POSIX path of thisSubf
            my getsubfoldersWithoutPDF(thisSubf)
        end repeat
    end tell
end getsubfoldersWithoutPDF
```

Pour ton autre question, je répondrais un peu plus tard.
Quelle est la version de l’OS sur lequel vous voulez exécuter le script ?


----------



## PO_ (16 Septembre 2015)

Merci à toi, c'est vraiment sympa.

Je suis sur un iMac Retina tournant sous Yosemite


----------



## JacqR (16 Septembre 2015)

Bonjour,


PO_ a dit:


> Mais, y aurait-il un moyen que cela m'ouvre une fenêtre de finder ne contenant que les dossiers en question, un peut comme ce que l'on obtient lorsque l'on fait un Commande-F et que l'on spécifie des arguments.


Voici une solution (testé sur un volume Mac OS étendu (journalisé)):
Ceci ajoute un tag spécial aux dossiers trouvés.
Va dans les présences du Finder --> Tags
Crée un nouveau tag, nomme-le ProcessusParScript
Ajoute-le dans la barre latérale en cochant la case.​Ouvre le dossier (le tag "*ProcessusParScript*")


Comme le script utilise des méthodes *Cocoa* :
Sélectionne le menu "Cocoa-AppleScript Applet" dans le menu "*Nouveau à partir d'un modèle*" du menu "*Fichier*" de l'éditeur de script
Copie/colle ce script, exécute le script.​

```
use framework "/System/Library/Frameworks/Foundation.framework"
use scripting additions
getsubfoldersWithoutPDF(choose folder with prompt "Sélectionnez le dossier où vous voulez recherchez des dossiers sans PDF")[/INDENT]

on getsubfoldersWithoutPDF(f)
    set myTag to {"ProcessusParScript"}
    tell application "System Events"
        repeat with i in (get folders of f)
            set thisSubf to contents of i
            if (files of thisSubf whose name extension is "pdf") is {} then
                set p to POSIX path of thisSubf
                (my addTags:myTag forPath:p)
            end if
            my getsubfoldersWithoutPDF(thisSubf)
        end repeat
    end tell
end getsubfoldersWithoutPDF

on addTags:tagList forPath:posixPath -- add to existing tags
    set aURL to current application's |NSURL|'s fileURLWithPath:posixPath
    set {theResult, theTags} to aURL's getResourceValue:(reference) forKey:(current application's NSURLTagNamesKey) |error|:(missing value)
    if theTags ≠ missing value then -- add new tags
        set tagList to (theTags as list) & tagList
        set tagList to (current application's NSOrderedSet's orderedSetWithArray:tagList)'s allObjects()
    end if
    aURL's setResourceValue:tagList forKey:(current application's NSURLTagNamesKey) |error|:(missing value)
end addTags:forPath:
```

Les dossiers seront affichés dans la fenêtre "*ProcessusParScript*" du Finder.
Important : ce script ne supprime aucun tag existant sur ces dossiers, il ajoute le tag "*ProcessusParScript*" aux autres tags.

Lorsque vous aurez terminé avec ces dossiers, supprime ce tag sur ces dossiers :
Sélectionnez tous les dossiers dans la fenêtre "*ProcessusParScript*"
clic-droit, sélectionnez le menu "Tags...", supprime le tag "ProcessusParScript"​


----------



## PO_ (16 Septembre 2015)

je te remercie infiniment.

Je testerais cela demain, car ce soir, je suis absent de chez moi.


----------



## PO_ (21 Septembre 2015)

Rebonjour,

toutes mes excuses pour ce long silence, mais j'ai été très occupé ces derniers jours et ce n'est que ce matin que j'ai pu tester le script.

J'ai un problème car il m'annonce une erreur de syntaxe : "Fin de ligne, etc. prévu(s) mais "[" trouvés " et il me met en surveillance le [ de la fin de la troisième ligne : [/INDENT].

Je ne sais pas si cela a une importance, mais depuis que je t'avais indiqué que j'étais sous Yosemite, je suis passé sur la version GM de El Capitan ...

Voila comme j'ai procédé : 

J'ai ouvert l'éditeur de script, et la fenêtre selon tes indications. Lorsque la fenêtre a été ouverte, il y avait des indications que j'ai effacées et j'ai collé l'intégralité du script fourni. J'ai ensuite cliqué sur le bouton d'exécution, et c'est là que j'ai eu le message. Est-ce la bonne manière de procéder ?

Je te remercie encore de ton aide.


----------



## JacqR (21 Septembre 2015)

Bonjour,



PO_ a dit:


> J'ai un problème car il m'annonce une erreur de syntaxe : "Fin de ligne, etc. prévu(s) mais "[" trouvés " et il me met en surveillance le [ de la fin de la troisième ligne : [/INDENT].
> 
> Je ne sais pas si cela a une importance, mais depuis que je t'avais indiqué que j'étais sous Yosemite, je suis passé sur la version GM de El Capitan ...


Il y a une erreur, suite à une mauvaise manipulation du BBCode '*INDENT*' (pour indenter des lignes dans les messages de ce forum),  il suffit de supprimer  '[/INDENT]' dans la troisième ligne du script.
Après cela, le script compilera sans erreur.


----------



## PO_ (21 Septembre 2015)

merci beaucoup, je teste de suite


----------



## PO_ (21 Septembre 2015)

Mille mercis. 

Cela fonctionne parfaitement. 

Au début, j'ai cru qu'il y avait un soucis car je ne voyais aucune fenêtre s'ouvrir. Puis, j'ai relu ton message initial, et mis les tags dans la barre latérale, et c'est en cliquant par mégarde sur "ProcessusParScript" que j'ai vu la fenêtre s'ouvrir. 

Je suis super content, ça va me faire gagner un temps fou...


----------



## PO_ (21 Septembre 2015)

Euh, je suis sûrement, une quiche, mais je ne vois pas comment supprimer les tags pour les dossiers considérés. SI je fais un clic droit sur les dossiers, je n'ai la possibilité que de supprimer les tags colorés de base du finder ...

Je suis désolé ...

Bon, avant d'envoyer ce message, j'ai fait un autre essai, et j'ai fait un clic droit sur le tag dans la barre latérale, et j'ai la possibilité de supprimer le tag sur l'intégralité des dossiers, c'est du tout-ou-rien. Mais bon, ça ne me gène pas plus que ça , mais par contre ça le supprime également de la barre latérale, ce qui est plus gênant ...

Encore merci.


----------



## PO_ (21 Septembre 2015)

Bon, je progresse un peu. Dans la fenêtre de préférences Finder, après avoir créé le tag, je l'ai glissé dans la zone du bas, et lorsque je clique sur 1 dossier, j'ai bien la possibilité de supprimer le tag. Par contre, si je sélectionne TOUS les dossier, je n'ai que la possibilité d'ajouter le tag (alors qu'il est déjà présent). J'ai enquêté, je me suis rendu compte que cela se produit dès que je sélectionne plus de 10 dossiers ... bizarre ... un bug du finder ? (ça n'aurait rien d'étonnant).

* Par contre, petite question subsidiaire, c'est normal qu'on soit obligé de force-quit l'applet ?*


----------



## PO_ (21 Septembre 2015)

Suite de mon roman-feuilleton, pour supprimer le tag sur plus de 10 dossiers, il faut faire Commande-Option-I, et dans la fenêtre globale d'informations, supprimer le tag en le sélectionnant et faire Backpace, ou supr. C'est un peu sioux, mais quand on a l'habitude du Mac, on arrive à trouver des méthodes de substitutions.


----------



## JacqR (22 Septembre 2015)

Bonjour,



PO_ a dit:


> Euh, je suis sûrement, une quiche, mais je ne vois pas comment supprimer les tags pour les dossiers considérés. SI je fais un clic droit sur les dossiers, je n'ai la possibilité que de supprimer les tags colorés de base du finder ...


Sur Yosemite :
Voici une image lorsque je fais un clic-droit sur un ou des dossiers.






Le menu "Tags..." est juste au-dessus des tags colorés.

Voici la fenêtre qui s'affiche après avoir sélectionné le menu "Tags..."





Il suffit de presser sur la touche "*Supprimer*" pour supprimer le tag.
On peut par la même occasion ajouter un autre tag ou plusieurs autres tags.


Cela se fait aussi dans l'inspecteur Commande-Option-I, ce que tu as déjà trouvé.​



PO_ a dit:


> * Par contre, petite question subsidiaire, c'est normal qu'on soit obligé de force-quit l'applet ?*


Non, ce n'est pas normal, normalement il faut quitter par le menu de l'application ou le menu de l'applet dans le dock (si vous avez enregistré le script en application).
Voici le script qui quitte par lui même :

```
use framework "/System/Library/Frameworks/Foundation.framework"
use scripting additions
try
    set dossier to choose folder with prompt "Sélectionnez le dossier où vous voulez recherchez des dossiers sans PDF"
on error
    quit -- l'utilisateur à presser le bouton "Annuler"
end try
getsubfoldersWithoutPDF(dossier)
quit

on getsubfoldersWithoutPDF(f)
    set myTag to {"ProcessusParScript"}
    tell application "System Events"
        repeat with i in (get folders of f)
            set thisSubf to contents of i
            if (files of thisSubf whose name extension is "pdf") is {} then
                set p to POSIX path of thisSubf
                (my addTags:myTag forPath:p)
            end if
            my getsubfoldersWithoutPDF(thisSubf)
        end repeat
    end tell
end getsubfoldersWithoutPDF

on addTags:tagList forPath:posixPath -- add to existing tags
    set aURL to current application's |NSURL|'s fileURLWithPath:posixPath
    set {theResult, theTags} to aURL's getResourceValue:(reference) forKey:(current application's NSURLTagNamesKey) |error|:(missing value)
    if theTags ≠ missing value then -- add new tags
        set tagList to (theTags as list) & tagList
        set tagList to (current application's NSOrderedSet's orderedSetWithArray:tagList)'s allObjects()
    end if
    aURL's setResourceValue:tagList forKey:(current application's NSURLTagNamesKey) |error|:(missing value)
end addTags:forPath:
```


----------



## PO_ (22 Septembre 2015)

Merci encore.

Puis-je abuser de ta gentillesse et te demander de faire un essai pour moi : Lorsque le tag ProcessusParScript est créé, je l'ai glissé dans la zone des tags favoris, ce qui fait qu'il apparaît dans le menu contextuel appelé par le clic droit.

ON peut ainsi affecter manuellement ce tag. Par contre, sous El Capitan, il m'est impossible de le supprimer de la même manière dès lors que plus de 10 dossiers sont sélectionnés. Je voudrais savoir s'il en est de même avec Yosemite.

Par contre, avec la méthode de suppression du tag que tu m'as indiqué, de même qu'avec la méthode du Commande-Option-I, il y a un gros gros problème : 

imaginons 15 dossiers : 5 avec le tag rouge, 5 avec le tag vert et 5 avec le tag jaune (peu importe les couleurs) et TOUS avec le tag ProcessusParScript : Si je sélectionne les 15 dossiers et que je supprime le tag ProcessusParScript que ce soit avec le menu contextuel Tag... ou avec Cmd-Opt-I, les 15 dossiers seront affectés des 3 tags rouge vert et jaune à l'issu de l'opération. J'ai l'impression qu'il y a un sérieux bug dans la gestion des tags multiples apparue dans Yosemite ...


----------



## JacqR (22 Septembre 2015)

Bonjour,



PO_ a dit:


> Puis-je abuser de ta gentillesse et te demander de faire un essai pour moi : Lorsque le tag ProcessusParScript est créé, je l'ai glissé dans la zone des tags favoris, ce qui fait qu'il apparaît dans le menu contextuel appelé par le clic droit.
> 
> ON peut ainsi affecter manuellement ce tag. Par contre, sous El Capitan, il m'est impossible de le supprimer de la même manière dès lors que plus de 10 dossiers sont sélectionnés. Je voudrais savoir s'il en est de même avec Yosemite.


C’est une bonne idée de le mettre dans les favoris, c’est plus rapide.
J’ai testé en mettant le tag dans les favoris, aucun problème pour supprimer ce tag sur les vingt dossiers sélectionnés.




PO_ a dit:


> Par contre, avec la méthode de suppression du tag que tu m'as indiqué, de même qu'avec la méthode du Commande-Option-I, il y a un gros gros problème :
> 
> imaginons 15 dossiers : 5 avec le tag rouge, 5 avec le tag vert et 5 avec le tag jaune (peu importe les couleurs) et TOUS avec le tag ProcessusParScript : Si je sélectionne les 15 dossiers et que je supprime le tag ProcessusParScript que ce soit avec le menu contextuel Tag... ou avec Cmd-Opt-I, les 15 dossiers seront affectés des 3 tags rouge vert et jaune à l'issu de l'opération. J'ai l'impression qu'il y a un sérieux bug dans la gestion des tags multiples apparue dans Yosemite ...


J'ai sélectionné 20 dossiers avec le tag "ProcessusParScript", 5 de ces dossiers ont le tag Rouge, 5 de ces dossiers ont le tag Orange, 5 de ces dossiers ont le tag Bleu et 5 de ces dossiers ont le tag Vert.

Je sélectionne le menu "Tags..."
Dans le champ, j'ai les cinq tags de ces dossiers, je supprime le tag "ProcessusParScript", je clic à coté de la fenêtre pour fermer cette fenêtre, les 20 dossiers disparaissent de la fenêtre "ProcessusParScript" du Finder.

Je vérifie les 20 dossiers, aucun de ces dossiers n'a de tag ajouter,  j'ai toujours 5 dossiers avec seulement le tag Rouge, 5 dossiers avec seulement le tag Orange, 5 dossiers avec seulement le tag Bleu et 5 dossiers avec seulement le tag Vert

Idem avec l'inspecteur Commande-Option-I.

Donc, il y'a des bogues dans* El Capitan*.


----------



## PO_ (22 Septembre 2015)

Ouaip ! 

Petite question subsidiaire : si tu mets le tag dans le menu des favoris, est-ce que tu peux le supprimer dans plus de 10 dossiers avec simplement le menu contextuel ... ?

Edit:

2 rapports de bug envoyés à Apple.


y aurait pas moyen de supprimer un tag avec un script ?


----------



## JacqR (22 Septembre 2015)

PO_ a dit:


> Petite question subsidiaire : si tu mets le tag dans le menu des favoris, est-ce que tu peux le supprimer dans plus de 10 dossiers avec simplement le menu contextuel ... ?


Oui, j'ai testé cela, et cela fonctionne bien sur Yosemite.



PO_ a dit:


> y aurait pas moyen de supprimer un tag avec un script ?


Oui, cela est possible.
Si vous préférez faire un glisser/déposer des dossiers sur l'applet, voici le script

```
use framework "/System/Library/Frameworks/Foundation.framework"

on open cesElements
    repeat with i in cesElements
        (my deleteTagsFor:(POSIX path of i) thisTag:"ProcessusParScript")
    end repeat
    quit
end open

on deleteTagsFor:posixPath thisTag:t
    set aURL to current application's |NSURL|'s fileURLWithPath:posixPath --
    set {theResult, theTags} to aURL's getResourceValue:(reference) forKey:(current application's NSURLTagNamesKey) |error|:(missing value)
    if theTags is not missing value then -- sinon aucun tag à supprimer.
        set myList to {}
        repeat with i in theTags
            tell (contents of i) as text to if it is not t then set end of myList to it
        end repeat
        aURL's setResourceValue:myList forKey:(current application's NSURLTagNamesKey) |error|:(missing value)
    end if
end deleteTagsFor:thisTag:
```

-----
Si vous préférez lancer l'applet après avoir sélectionné des dossiers, voici le script

```
use framework "/System/Library/Frameworks/Foundation.framework"

tell application "Finder" to set cesElements to selection as alias list
repeat with i in cesElements
    (my deleteTagsFor:(POSIX path of i) thisTag:"ProcessusParScript")
end repeat
quit

on deleteTagsFor:posixPath thisTag:t
    set aURL to current application's |NSURL|'s fileURLWithPath:posixPath --
    set {theResult, theTags} to aURL's getResourceValue:(reference) forKey:(current application's NSURLTagNamesKey) |error|:(missing value)
    if theTags is not missing value then -- sinon aucun tag à supprimer.
        set myList to {}
        repeat with i in theTags
            tell (contents of i) as text to if it is not t then set end of myList to it
        end repeat
        aURL's setResourceValue:myList forKey:(current application's NSURLTagNamesKey) |error|:(missing value)
    end if
end deleteTagsFor:thisTag:
```

------
Si vous préférez un service accessible par le menu contextuel (sur les éléments sélectionnés dans le Finder) ou par raccourcis clavier,  c'est possible de créer ce service avec *Automator*.

Edition :
Comme ces scripts utilise des méthodes *Cocoa* :
Sélectionne le menu "*Cocoa-AppleScript Applet*" dans le menu "*Nouveau à partir d'un modèle*" du menu "*Fichier*" de l'éditeur de script​


----------



## PO_ (22 Septembre 2015)

Je te remercie infiniment pour ton aide et tes vérifications, c'est vraiment sympa.


----------



## JacqR (1 Octobre 2015)

Bonjour,

Je viens d’installer El Capitan (la version dans l’*app store*) sur une partition pour tester.
Je confirme, j’obtiens exactement les mêmes *bogues* que ceux que vous avez décrits dans vos messages.


----------



## PO_ (2 Octobre 2015)

et ils n'ont toujours pas été corrigés dans la 10.11.1 béta. 

Peut-Être serait-il bon de les faire remonter vers Apple, histoire d'enfoncer un peu plus le clou.

En tout cas, merci de continuer à vous intéresser à mon problème.


----------

