Aktualizacja: Rozwiązanie poniżejAppleScript: Jak sprawdzić, czy coś jest katalog lub plik
Załóżmy, że masz listę wybranych elementów z Finder. Powiedzmy, że niektóre pliki, foldery, różne pakiety, a nawet niektóre aplikacje zawarte w wyborze.
Teraz powiedzmy, że chcesz tylko te pozycje, które są (pod UNIX-ami) katalogami . To znaczy. chcesz tylko rzeczy, które możesz cd
w terminalu.
Można sprawdzić każdego elementu kind
nieruchomości i sprawdzić, czy jest on równy „Folder”, ale to nie działa dla wiązek skarga lub inny pakiet/pakiety, choć w rzeczywistości są „foldery” (katalogi)
Jeśli elementy są rzeczywistymi obiektami pliku (nie są aliasami), możesz sprawdzić właściwość każdego elementu o wartości class
... z tym że nie zawsze działa, ponieważ pakiety są teraz instancjami "pliku dokumentu", a aplikacje są instancjami "pliku aplikacji".
Gorzej, jeśli masz tylko listę aliasów zamiast rzeczywistych obiektów plików, ponieważ nie można sprawdzić właściwości class
; zawsze będzie po prostu mówić "alias".
Jedyne rozwiązania, jakie mogę wymyślić, to albo uzyskać ścieżkę POSIX każdego elementu i sprawdzić, czy ma on ciągły ukośnik do przodu, czy też wysłać ścieżkę do skryptu napisanego w innym języku, który może sprawdzić jeśli coś jest katalogiem, czy nie.
Obie pomysły wydają mi się szalone. Sprawdzenie końca ukośnika jest niezwykle kruchy i kruchy, a podawanie wszystkiego do innego skryptu jest kompletnym przesadą.
Aktualizacja: Co Asmus sugeruje poniżej wydaje się być
jedynym
dobrym rozwiązaniem
, jak się wydaje, nie ma mowy o AppleScript zrozumieć to na własną rękę
:
do shell script "file -b " & filePosixPath
To zwróci ciąg "katalog" dla folderów, pakietów, aplikacji, pakietów itp. Itd.
Ale uwaga (!), Że dla dysków zwraca "katalog przyklejony".
Oto uogólniona funkcja, która działa całkiem dobrze
on isDirectory(someItem) -- someItem is a file reference
set filePosixPath to quoted form of (POSIX path of (someItem as alias))
set fileType to (do shell script "file -b " & filePosixPath)
if fileType ends with "directory" then return true
return false
end isDirectory
Cóż, powiedziałbym, najprostszym rozwiązaniem jest przekazać ścieżki POSIX do narzędzia wiersza poleceń 'plik', gdzie np 'file -b/Applications/Safari.app' po prostu zwraca" katalog ". Włączenie tego w pętlę 'wykonaj skrypt powłoki' powinno być łatwe. – Asmus
@Asmus: Prawdopodobnie masz rację. Po tym, jak napisałem to pytanie, zdałem sobie sprawę, że mogę po prostu wykonać polecenie szybkiej powłoki, zamiast pełnego skryptu powłoki. Mimo wszystko wydaje się dziwne, że trzeba wyjść poza AppleScript, aby dowiedzieć się czegoś tak podstawowego, jak to, czy coś jest katalogiem. Zostawiam pytanie na jakiś dzień, a tymczasem możesz napisać swój komentarz jako odpowiedź, dzięki czemu możesz zdobyć punkty :) – Flambino
@Flambino Nie mogę przegłosować twojego dobrego pytania, ponieważ użyłem wszystkich moich głosów do góry! :( – fireshadow52