AppleScript – Seznam složek, podsložek a souborů

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.

Autor

Dlouholetý uživatel produktů Apple všeho druhu a věčný experimentátor. Dne 1.1.2012 po několikaletém rozmýšlení založil tento blog pro začínající i zkušené uživatele a pokud může vždy se snaží pomoct. Držitel Apple Certified Associate - Mac Integration 10.7, Apple Certified Associate - Mac Integration 10.8. Apple Certified Support Professional 10.7 a Apple Certified Technical Coordinator 10.7

2 comments

  • 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. 😉

Přidávání komentářů není povoleno