AppleScript – Seznam složek, podsložek a souborů
Před několika dny nám jeden čtenář poslal zajímavý dotaz. Protože si myslíme, že na podobný problém může v budoucnu narazit každý z nás rozhodli jsme se na dotaz odpovědět návodem i pro vás ostatní. Čtenář nás žádal o řešení pomocí Automatoru. Bohužel Automator na toto nestačí a proto jsme si pomohli AppleScriptem.
Dobrý den, mám složku, která čítá přes 6000 podsložek a rád bych vytvořil seznam těchto složek. Rád bych Vás poprosil o radu a o pomoc, zda je možné a popřípadě jak by bylo možné aby Automator z každé složky vyčetl název a vložil ho například do excelu, nebo do textového souboru a vytvořil tak celkový seznam názvů všech složek?
Krok první
Otevřeme si aplikaci Editor AppleScriptu (Aplikace -> Utility) a zkopírujeme do něj následující text:
property script_name : "Zobrazit obsah složky" property script_description : "This script will list a folder's contents returning full paths as strings and limit the list to specific file types. The script can also process subfolders (recursion)." set the_folder to (choose folder with prompt "Vyberte adresář:") as Unicode text set file_types to {} --file types, set to {} and inc_folders to true to just return folders; file types are 4 character codes such as "osas" or "TEXT" set with_subfolders to my get_boolean("Zahrnout podsložky?", {"Ne", "Ano"}) if with_subfolders = "user cancelled" then return set inc_folders to my get_boolean("Zahrnout složky do seznamu? (Pokud chcete pouze názvy souborů a ne názvy složek vyberte \"Ne\".)", {"Ne", "Ano"}) if inc_folders = "user cancelled" then return set use_posix_path to my get_boolean("Zobrazit cesty k souborům jako HFS (Mac-styl) nebo POSIX (UNIX-style)?", {"HFS", "POSIX"}) if use_posix_path = "user cancelled" then return set return_as_string to my get_boolean("Zobrazit výsledky jako seznam AppleScript nebo jako řetězec s každým souborem na vlastním řádku?", {"Seznam", "Řetězec"}) if return_as_string = "user cancelled" then return set add_to_clipboard to my get_boolean("Zkopírovat výsledek do schránky?", {"Ne", "Ano"}) if add_to_clipboard = "user cancelled" then return set the_files to get_folder_list(the_folder, file_types, with_subfolders, inc_folders, use_posix_path) if return_as_string then tell (a reference to my text item delimiters) set {old_tid, contents} to {contents, return} set {the_files_string, contents} to {the_files as Unicode text, old_tid} end tell copy the_files_string to the_files end if if add_to_clipboard then if not return_as_string then copy the_files to the_files_string repeat with i from 1 to (count the_files_string) set item i of the_files_string to ("\"" & item i of the_files_string & "\", ") end repeat set the_files_string to ("{" & (text 1 thru -3 of (the_files_string as Unicode text)) & "}") end if set the clipboard to the_files_string end if beep return the_files on get_folder_list(the_folder, file_types, with_subfolders, inc_folders, use_posix_path) set the_files to {} tell application "Finder" to set folder_list to items of folder the_folder repeat with new_file in folder_list try set temp_file_type to file type of new_file on error set temp_file_type to "fold" end try if file_types contains temp_file_type or file_types = {} then if use_posix_path then set the_files to the_files & {POSIX path of (new_file as Unicode text)} else set the_files to the_files & {new_file as Unicode text} end if end if if temp_file_type = "fold" then if inc_folders and file_types ≠ {} then if use_posix_path then set the_files to the_files & {POSIX path of (new_file as Unicode text)} else set the_files to the_files & {new_file as Unicode text} end if end if if with_subfolders then set the_files to the_files & my get_folder_list((new_file as Unicode text), file_types, with_subfolders, inc_folders, use_posix_path) end if end repeat return the_files end get_folder_list on get_boolean(m, b) try return (button returned of (display dialog m buttons ({"Zrušit"} & b) default button 3 with icon 1) = (b's item 2)) on error return "user cancelled" end try end get_boolean
Krok druhý
Vytvořený skript si uložíme například na Plochu a pojmenujeme jej například Seznam. Soubor můžeme uložit jako skript (ten poté nakopírovat do složky skriptů uživatele) nebo jej můžeme uložit jako samostatnou aplikaci.
Krok třetí
Nyní již stačí námi vytvořený skript (nebo aplikaci) spustit a nechat ji jej dělat svou práci. Protože se skript ve svém průběhu ptá na několik věcí, podíváme se na to podrobněji.
Po spuštění budeme dotázáni jako složku (a její podsložky) má skript prohledat.
Po vybrání složky budeme dotázáni zda chceme do vyhledávání zahrnout i podsložky.
Další volba je zda do výpisu zahrnout i názvy nadřazených složek.
V následující volbě vybereme v jakém formátu chceme výpis mít. Záleží na každém jaký výpis bude preferovat. Já osobně se přikláním k POSIX.
Výpis HFS:
Výpis POSIX:
V další volbě máme na výběr zda chceme výpis jako seznam AppleScriptu nebo jako řetězec. Pro přehlednost doporučuji použít řetězec, protože v seznamu AppleScriptu je opravdu těžké se orientovat.
A máme tu poslední volbu ve které vybereme zda chceme výsledek zkopírovat do schránky. Pokud vybereme, že ano stačí po skončení skriptu zkopírovat váš výsledek například do textového souboru.
Zdarec.
Shodou okolností si dělám pořádek na svých úložištích a já to řešil pomocí Automátoru a kupodivu jsem dospěl jednoduše ke stejnému výsledku. Tedy dostanu stejný výpis do TextEditu jako Vy POSIX. Tvar:
/Users/jerry00/Desktop/asasas/aaaa
/Users/jerry00/Desktop/asasas/bbbb
/Users/jerry00/Desktop/asasas/ccccc
/Users/jerry00/Desktop/asasas/ddddd
/Users/jerry00/Desktop/asasas/eeee
V Automátoru vytvořím aplikaci-vyberu Načíst obsah složky(zaškrtnu Opakovat pro každou podsložku), jako další položku přetáhnu Nový textový soubor(v položkách pro TextEdit) a uložím jako aplikaci. získám pak přetahovací aplikaci, na kterou přetáhnu složku a dostanu onen výpis v nastaveném kódování a místě.
Super, diky Jerry za upozorneni. Udelam to jako navod i pro ostatni uzivatele. 😉