Inteligentny filtr folderów „nie zawiera”

13

Folder inteligentny Wyłącz folder

Ostatecznie chcę, aby wynikiem tego polecenia find był inteligentny folder.

Kryteria nie są tak skomplikowane:

  • nazwa powinna brzmieć „README.md”
  • typ powinien być plikiem
  • ścieżka nie powinna zawierać „node_modules”

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

Problem polega na tym, że na liście operatorów kryteriów inteligentnych folderów brakuje does not containopcji.

Dostępne opcje to:

  • mecze
  • zawiera
  • Zaczyna się z
  • kończy się na
  • jest
  • nie jest

Czy można to osiągnąć, a jeśli tak, to w jaki sposób?

Edytuj 1

Przekonałem się, że przytrzymując klawisz opcji, mogę dodać klauzulę negacji do kryteriów wyszukiwania inteligentnych folderów, ale nie mogę wykluczyć folderu node_modules. Nie jest jasne, które kryteria zastosować, ale żadne z tych, które próbowałem, nie działają:

  • Pojemnik na dokumenty
  • Zawierające nazwy folderów
  • Nazwa folderu

Próbowałem połączyć je z następującymi operatorami:

  • zawiera
  • mecze

oraz z następującymi warunkami:

  • node_modules
  • node_modules

w przypadku gdy obsługuje wyszukiwanie z użyciem symboli wieloznacznych.

Próbowałem wszystkich kombinacji powyższych filtrów, operatorów i warunków.

Dokumentacja na ten temat jest bardzo uboga.

wprowadź opis zdjęcia tutaj

km6zla
źródło
2
Znalazłeś rozwiązanie?
gota

Odpowiedzi:

2

Wygląda na to, że kMDItemPath nie może zrobić tego, czego potrzebujesz:

no-results-in-spotlight-in-searches-against-kmditempath

Niektóre potencjalne alternatywy są omówione tutaj:

how-to-locate-a-file-in-spotlight-using-folder-and-file-name

GraniteRobert
źródło
1
Dzięki, ale mam już funkcję wiersza polecenia, która pobiera pliki, którymi jestem zainteresowany, i tworzę folder inteligentny, nie wyszukując w centrum uwagi. Natknąłem się na ograniczenie mkdItemPath.
km6zla
Wyszukiwanie Spotlight i inteligentne foldery korzystają z tego samego mechanizmu wewnętrznego. kMDItemPath nie będzie działać w żadnym z tych interfejsów użytkownika.
GraniteRobert
1

Istnieje obejście, ale nie jest bardzo ładne. Będzie to jednak służyć Twoim celom, jeśli chcesz uzyskać dostęp do plików README w jednym folderze (przy użyciu określonych kryteriów) i mieć pojęcie o tym, skąd pochodzą.

Chodzi o to, aby użyć skryptu powłoki, aby znaleźć odpowiednie pliki, a następnie zebrać aliasy do każdego pliku w jednym katalogu. Następnie zmieniamy nazwę aliasów, aby powiedzieć nam, do którego katalogu macierzystego należy oryginalny plik.

Applescript, aby to zrobić, znajduje się poniżej. Wygląda tu brzydko, ale spróbuj wkleić go do Script Editor i skompilować, a powinieneś być w stanie zobaczyć logikę.

--- 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
źródło
Nie wiem czy to działa. +1 za nawet wymyślenie tego. Nie jestem skłonny posunąć się tak daleko, aby utworzyć folder readme.
km6zla