2011-07-29 12 views
7

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 
+2

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

+0

@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

+0

@Flambino Nie mogę przegłosować twojego dobrego pytania, ponieważ użyłem wszystkich moich głosów do góry! :( – fireshadow52

Odpowiedz

6

Istnieje proste rozwiązanie applescript. Możesz sprawdzić, czy coś jest "pakietem" przy użyciu zdarzeń systemowych.

tell application "Finder" to set theItems to (selection) as alias list 

set canCDItems to {} 
tell application "System Events" 
    repeat with anItem in theItems 
     if anItem is package folder or kind of anItem is "Folder" or kind of anItem is "Volume" then 
      set end of canCDItems to contents of anItem 
     end if 
    end repeat 
end tell 
return canCDItems 
+0

Interesujące! Dziwne, że to słownictwo jest pochowane w Zdarzeniach Systemowych, a nie w Finderze, ale przynajmniej istnieje. Skończyło się na tym, że korzystałem z rozwiązania Asmusa, ale odpowiedziałeś na oryginalne pytanie, więc wskazówka dla ciebie (i zaznaczenie) do ciebie. Dzięki! – Flambino

+2

Hi. Zdarzenia systemowe zostały stworzone w celu odciążenia Findera. Zasadniczo Finder często zajmuje się zadaniami związanymi z komputerem, więc najlepiej jest pytać o zdarzenia systemowe, aby robić rzeczy zamiast Findera, jeśli to możliwe. Jako takie zdarzenia systemowe mogą wykonywać większość czynności, które może wykonać Finder, a czasem nawet więcej. Sugerowałbym za każdym razem, gdy myślisz o użyciu Findera, który sprawdzisz, czy zdarzenia systemowe mogą to zrobić. – regulus6633

+0

Dzięki za informacje o tle. Nie wiedziałem, że to geneza zdarzeń systemowych, ale ma to sens. Przyjrzę się bliżej słownikowi zdarzeń systemowych. Bardzo zobowiązany! – Flambino

0

Musiałem to dzisiaj, a ja starałem się podłączyć kilka narzędzi diff do Finder Mountain Lion i chciał sprawdzić, czy wybrany przedmiot lub przedmioty były foldery lub pliki. Ten pracował dla mnie:

tell application "Finder" 
    set sel1 to the selection 
    set class1 to class of (item 1 of sel1) 
    set cs to (class1 as string) 
    ... 
    if cs = "folder" or cs contains "class cfol" then 
    set choice to display alert "Which tool?" buttons {"opendiff", "diffmerge"} 
    set tool to (button returned of choice) 

znalazłem musiałem testować cs obu przypadkach, w zależności od tego, czy biegałam w Edytorze AppleScript lub wskutek klikając przycisk paska narzędzi na Finder.Daleko od neatest, ale krótszy niż poprzedni AppleScript jedyne rozwiązanie, to byłaby moja propozycja alternatywna

on isDirectory(someItem) 
    ((class of someItem) as string) contains "fol" 
end isDirectory 

Wyniki pełnego badania we wszystkich okolicznościach witamy!

1

Jeśli zmienna jest po prostu ciągiem znaków, skorzystaj z poniższego formularza:

on isDirectory(someItem) -- someItem is a string 
    set filePosixPath to quoted form of (POSIX path of someItem) 
    set fileType to (do shell script "file -b " & filePosixPath) 
    if fileType ends with "directory" then return true 
    return false 
end isDirectory 
0

Standardowe Zwiększenia oferuje to (żadne zdarzenia systemowe konieczne):

set isBundleType to package folder of (info for (choose file)) 
Powiązane problemy