15 votes

Filtre intelligent de dossiers "ne contient pas".

Dossier intelligent Exclure le 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 des opérateurs de critères de dossiers intelligents semble manquer d'un does not contain option.

Les options disponibles sont les suivantes :

  • correspond à
  • contient
  • commence par
  • se termine par
  • est
  • n'est pas

Est-il possible de le faire et si oui, comment ?

Edit 1

J'ai découvert qu'en maintenant la touche option, je peux ajouter une clause de négation aux critères de recherche du dossier intelligent, mais je ne parviens pas à exclure le dossier node_modules. Les critères à utiliser ne sont pas clairs, mais aucun de ceux que j'ai essayés ne semble fonctionner :

  • Conteneur de documents
  • Contenir les noms de dossiers
  • Nom du dossier

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

  • contient
  • correspond à

et avec les conditions suivantes :

  • modules de nœuds
  • modules de nœuds

au cas où il prendrait en charge les recherches par caractères génériques.

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

La documentation est tellement pauvre sur le sujet.

enter image description here

2voto

GraniteRobert Points 233

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

pas de résultats dans les recherches contre les kmditempath

Certaines alternatives potentielles sont discutées ici :

comment-localiser-un-fichier-dans-la-lumière-utilisant-le-dossier-et-le-nom-de-fichier

1voto

Delyle Points 423

Il existe une solution de contournement, mais elle n'est pas très jolie. Cependant, elle répondra à vos besoins si vous souhaitez simplement accéder à vos README dans un seul dossier (en utilisant les critères que vous avez spécifiés), et avoir une idée de leur provenance.

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

L'Applescript pour faire cela est ci-dessous. Il semble laid ici, mais essayez de le coller dans l'éditeur script et de le compiler, et vous devriez être en mesure de 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

0voto

dimdm Points 591

Lorsque vous faites une requête brute, ajoutez simplement ceci :

(kMDItemPath != "folder to exclude")

0voto

seacelo Points 1

David, dans la documentation de kMDItemPath :

"Chemin complet du fichier. La valeur de cet attribut peut être récupérée, mais ne peut pas être utilisée dans une requête ou pour trier les résultats de la recherche. Cet attribut ne peut pas être utilisé comme membre du paramètre de tableau valueListAttrs pour MDQueryCreate ou MDQueryCreateSubset."

J'ai essayé et ça ne marche pas

https://developer.apple.com/library/archive/documentation/CoreServices/Reference/MetadataAttributesRef/Reference/CommonAttrs.html#//apple_ref/doc/uid/TP40001694-SW1

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