Фильтр смарт-папок «не содержит»

13

Умная папка Исключить папку

В конечном итоге я хочу, чтобы результатом этой команды поиска была интеллектуальная папка.

Критерии не так сложны:

  • имя должно быть "README.md"
  • тип должен быть файл
  • путь не должен содержать "node_modules"

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

Проблема в том, что в списке операторов критериев умных папок отсутствует does not containопция.

Доступные варианты:

  • Матчи
  • содержит
  • начинается с
  • заканчивается
  • является
  • не является

Возможно ли это сделать, и если да, то как?

Редактировать 1

Я обнаружил, что, удерживая клавишу параметра, я могу добавить условие отрицания в критерии поиска смарт-папок, но, похоже, не могу успешно исключить папку node_modules. Неясно, какие критерии использовать, но ни один из тех, которые я пробовал, кажется не работает:

  • Контейнер для документов
  • Содержит имена папок
  • Имя папки

Я попытался объединить их со следующими операторами:

  • содержит
  • Матчи

и со следующими условиями:

  • node_modules
  • node_modules

в случае, если он поддерживает поиск по шаблону.

Я перепробовал все комбинации вышеуказанных фильтров, операторов и терминов.

Документация очень плохая по этому вопросу.

введите описание изображения здесь

km6zla
источник
2
Вы нашли решение?
Гота

Ответы:

2

Похоже, kMDItemPath не может делать то, что вам нужно:

нет-результаты в-прожектора-в-поисках-против-kmditempath

Некоторые потенциальные альтернативы обсуждаются здесь:

как к найти-а-файл-в-прожектор-с использованием-папки-и-имя-файла

GraniteRobert
источник
1
Спасибо, но у меня уже есть функция командной строки, которая извлекает интересующие меня файлы, и я делаю смарт-папку, а не выполняю поиск в центре внимания. Я столкнулся с ограничением mkdItemPath.
km6zla
В Spotlight Search и Smart Folders используется один и тот же внутренний механизм. kMDItemPath не будет работать ни в одном из этих пользовательских интерфейсов.
GraniteRobert
1

Есть обходной путь, но это не очень красиво. Однако он будет служить вашим целям, если вы просто хотите получить доступ к своим файлам README в одной папке (используя указанные вами критерии) и иметь некоторое представление о том, откуда они берутся.

Идея состоит в том, чтобы использовать сценарий оболочки для поиска нужных файлов, а затем собирать псевдонимы для каждого файла в одном каталоге. Затем мы переименовываем псевдонимы, чтобы сообщить нам, к какому родительскому каталогу принадлежит исходный файл.

Applescript для этого ниже. Здесь это выглядит ужасно, но попробуйте вставить его в Script Editor и скомпилировать, и вы сможете увидеть логику.

--- 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
источник
Я не знаю, работает ли это. +1 даже за то, что придумал. Я не хочу заходить так далеко, чтобы создать папку readme.
km6zla