Le filtre de dossier intelligent «ne contient pas»

13

Dossier intelligent Exclure un dossier

En fin de compte, je veux que le résultat de cette commande find soit un dossier intelligent.

Les critères ne sont pas si compliqués:

  • le nom doit être "README.md"
  • le type doit être un fichier
  • le chemin ne doit pas contenir "node_modules"

find /Users/me/Documents -type f -name README.md -not -path "*/node_modules/*"

Le problème est que la liste d'opérateurs de critères des dossiers intelligents semble manquer d'une does not containoption.

Les options disponibles sont:

  • allumettes
  • contient
  • commence par
  • se termine par
  • est
  • n'est pas

Est-il possible d'accomplir cela et si oui, comment?

Modifier 1

J'ai trouvé qu'en maintenant la touche d'option je suis capable d'ajouter une clause de négation aux critères de recherche de dossier intelligent mais je n'arrive pas à exclure avec succès le dossier node_modules. On ne sait pas quels critères utiliser, mais aucun de ceux que j'ai essayés ne semble fonctionner:

  • Conteneur de documents
  • Contenant des noms de dossier
  • Nom de dossier

J'ai essayé de les combiner avec les opérateurs suivants:

  • contient
  • allumettes

et avec les termes suivants:

  • node_modules
  • node_modules

au cas où il prend en charge les recherches génériques.

J'ai essayé toutes les combinaisons des filtres, opérateurs et termes ci-dessus.

La documentation est si pauvre sur le sujet.

entrez la description de l'image ici

km6zla
la source
2
Avez-vous trouvé une solution?
gota

Réponses:

2

Il semble que kMDItemPath ne puisse pas faire ce dont vous avez besoin:

pas de résultats en vedette dans les recherches contre kmditempath

Certaines alternatives potentielles sont discutées ici:

comment-localiser-un-fichier-dans-spotlight-using-folder-and-file-name

GraniteRobert
la source
1
Merci mais j'ai déjà une fonction de ligne de commande qui récupère les fichiers qui m'intéressent et je crée un dossier intelligent, sans faire de recherche Spotlight. J'ai rencontré la limitation de mkdItemPath.
km6zla
La recherche Spotlight et les dossiers intelligents utilisent le même mécanisme interne. kMDItemPath ne fonctionnera dans aucune de ces interfaces utilisateur.
GraniteRobert
1

Il existe une solution de contournement, mais ce n'est pas très joli. Il servira cependant à vos fins si vous souhaitez simplement accéder à vos fichiers README dans un dossier (en utilisant les critères que vous avez spécifiés), et avoir une idée d'où ils viennent.

L'idée est d'utiliser votre script shell pour trouver les bons fichiers, puis de collecter des alias pour chaque fichier dans un répertoire. Nous renommons ensuite les alias pour nous dire à quel répertoire parent appartient le fichier d'origine.

L'Applescript pour ce faire est ci-dessous. Cela a l'air moche ici, mais essayez de le coller dans Script Editor et de le compiler, et vous devriez pouvoir voir la logique.

--- Set up the name of the folder to contain search results
set myFolder to POSIX file "/Users/me/SmartFolder"

--- Clear the folder of contents. Then we will see only the results of an updated search
tell application "Finder"
    display dialog "WARNING. This will delete all files below " & (POSIX path of myFolder) & " . Are you sure you want to continue?"
    delete (every item of folder myFolder)
    --- alternatively, if you want to keep your script in the same folder, replace the line above with
    --- delete ((every item of folder myFolder) whose name does not end with ".scpt")
end tell

--- The shell command that is doing all the searching
set FileList to do shell script "find /Users/me/Documents -type f -name README.md -not -path '*/node_modules/*'"

--- The rest of the script takes each file and makes an alias in our folder containing search results. The aliases are renamed according to "ParentDirectory_filename"
set FileList to paragraphs of FileList
repeat with CurrentFile in FileList
    set ASCurrentFile to POSIX file CurrentFile
    set PathList to words of (ASCurrentFile as string)
    --- Make the new name include the Parent Directory and file name
    set NewName to (item -2 of PathList) & "_" & (item -1 of PathList)
    tell application "Finder"
        make new alias file at myFolder to ASCurrentFile
        --- We need to save the name/location of the new alias file before we can try to rename it
        set NewAlias to result
        set i to 1
        repeat
            try
                --- Try to rename the alias. Won't work if there's already an alias with the new name
                set name of NewAlias to NewName
                exit repeat
            on error
                --- Append a number to the alias. Increase the number for more duplicates
                if i is not equal to 1 then
                    set NewName to text 1 thru -3 of NewName
                end if
                set NewName to NewName & " " & i
                set i to (i + 1)
            end try
        end repeat
    end tell
end repeat
Delyle
la source
Je ne sais pas si cela fonctionne. +1 pour même venir avec elle. Je ne suis pas prêt à aller aussi loin pour créer un dossier Lisez-moi.
km6zla