AppleScriptでフォルダ階層以下すべての指定種類のファイルリストを取得〜指定kind救出作戦

2016年6月8日AppleScript,Mac

AppleScriptで、あるフォルダ階層以下(下位フォルダも含む)に入っている、すべてのファイルのリスト(aliasのリスト)を取る必要がありました。

  1. “System Events"でファイル一覧取得
  2. kind of …で指定した種類のファイルを記録
  3. “System Events"でフォルダ一覧取得
  4. それぞれのフォルダに付いて、再起的に同じ事を繰り返す

次の例の場合、png形式の画像ファイルのリストを作っています。

(* Gather files whose are "kdTyp"
 * Copyright (c) 2014 webmaster@oichinote.com
 * Created on 2014-06-19
 * Licence is GPL2
 *)

global kdList
global kdType
set kdList to {}
set kdType to "PNG イメージ"

set startFolder to choose folder
gatherKind(startFolder)
display dialog length of kdList

-- Gather all files whose kind is kdType to kdList
on gatherKind(startFolder)
	-- get all files
	tell application "System Events"
		set allFiles to every file of startFolder
	end tell
	
	-- get files of kdType
	repeat with aFile in allFiles
		-- set name_of_file to (name of aFile)
		if kind of aFile is equal to kdType then
			set end of kdList to (aFile as alias)
		end if
	end repeat
	
	-- get all folders
	tell application "System Events"
		set newFolders to every folder of startFolder
	end tell
	
	-- recuresive call
	repeat with aFolder in newFolders
		gatherKind(aFolder)
	end repeat
end gatherKind

見つかったファイルを、alias形式でどんどん追加して行きます。aliasとは、多分CNIDの事だと思います。

最初、&演算子でリストの追加をしていたのですが、"end of …"を使った方が速いと、次のページに書かれていたので試してみました。

確かに速くなりました! ありがとうございます。そして、リストには、[]形式もあると言う事で、こちらも試してみました。そうしたら、10分以上経過しても終了しませんでした。

手法 1回目 2回目 3回目 平均
“&" 17,328.2ミリ秒 22,366.8ミリ秒 27,884.6ミリ秒 22,526.5ミリ秒
end of 15,524.6ミリ秒 18,604.0ミリ秒 21,778.2ミリ秒 18,635.6ミリ秒

この実験には、約6,000個のファイルをリストアップしています。

ファイルリスト取得

時間計測には次のスクリプティング機能拡張を使いました。ありがとうございます。ダウンロードした後、右クリックで「開く」必要があります。

また、リストアクセスの高速化手法に付いても、書かれています。こちらは、リストを作る時ではなく、アクセスする時の高速化です。

AppleScriptと言えば、次のウェブサイトに非常に多くの情報があります。特定の種類のファイルを集める効率的なやり方が掲載されています。ありがとうございます。

使えるのか? 私に? ここで紹介されているテクニックは高尚すぎて、残念ながら私には使いこなせませんでした。

Posted by お市のかた