Filtro de pasta inteligente "não contém"

13

Pasta inteligente Excluir pasta

Por fim, quero que o resultado desse comando find seja uma pasta inteligente.

Os critérios não são tão complicados:

  • nome deve ser "README.md"
  • tipo deve ser arquivo
  • o caminho não deve conter "node_modules"

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

O problema é que a lista de operadores de critérios de pastas inteligentes parece não ter uma does not containopção.

As opções disponíveis são:

  • fósforos
  • contém
  • começa com
  • termina com
  • é
  • não é

É possível fazer isso e, se sim, como?

Editar 1

Descobri que, mantendo a tecla de opção, posso adicionar uma cláusula de negação aos critérios de pesquisa de pastas inteligentes, mas não consigo excluir com êxito a pasta node_modules. Não está claro quais critérios usar, mas nenhum dos que tentei parece funcionar:

  • Contêiner de documentos
  • Contendo nomes de pastas
  • Nome da pasta

Eu tentei combiná-los com os seguintes operadores:

  • contém
  • fósforos

e com os seguintes termos:

  • node_modules
  • node_modules

caso suporte pesquisas de caracteres curinga.

Eu tentei todas as combinações dos filtros, operadores e termos acima.

A documentação é tão ruim sobre o assunto.

insira a descrição da imagem aqui

km6zla
fonte
2
Você encontrou uma solução?
gota

Respostas:

2

Parece que o kMDItemPath não pode fazer o que você precisa:

nenhum resultado em destaque em pesquisas contra kmditempath

Algumas alternativas possíveis são discutidas aqui:

como localizar um arquivo em destaque usando pasta e nome de arquivo

GraniteRobert
fonte
11
Obrigado, mas eu já tenho uma função de linha de comando que recupera os arquivos nos quais estou interessado e estou criando uma Pasta Inteligente, não fazendo uma pesquisa de destaque. Eu me deparei com a limitação do mkdItemPath.
precisa
A Pesquisa Spotlight e as Pastas inteligentes usam o mesmo mecanismo interno. O kMDItemPath não funcionará em nenhuma dessas interfaces de usuário.
precisa saber é o seguinte
1

Existe uma solução alternativa, mas não é muito bonita. No entanto, isso servirá a seus propósitos se você quiser acessar seus READMEs em uma pasta (usando os critérios especificados) e tiver alguma noção de onde eles são.

A idéia é usar seu script de shell para encontrar os arquivos corretos e depois coletar aliases para cada arquivo em um diretório. Em seguida, renomeamos os aliases para nos dizer a qual diretório pai o arquivo original pertence.

O Applescript para fazer isso está abaixo. Parece feio aqui, mas tente colá-lo no Editor de scripts e compilá-lo, e você poderá ver a lógica.

--- 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
fonte
Não sei se isso funciona. +1 para chegar a ele. Não estou disposto a ir tão longe para criar uma pasta leia-me.
km6zla