[Automator & AppleScript] Automator: 入力がファイルかフォルダかを判別する

file, folder と package folder の3種類が存在する。

最初にこのあたりを眺めていて、いろいろな手法があるので混乱してました。

下記を試しながら、file, folder と package folder の3種類を区別できるということで、スッキリしました。

Contents

info for で対象の情報を取得する

info for で対象情報を拾ってみる。

on run {input}
    set src to input
    return info for src
end run

folder:true, package folder:false という両方の値を見る必要があることが分かる。

file

{name:"ci1.png", creation date:date "2013年12月13日金曜日 20:55:46", modification date:date "2013年12月13日金曜日 20:56:31", size:21734, folder:false, alias:false, package folder:false, visible:true, extension hidden:false, name extension:"png", displayed name:"ci1.png", default application:alias "Macintosh HD:Applications:Preview.app:", kind:"PNG イメージ", file type:"", file creator:"", type identifier:"public.png", locked:false, busy status:false, short version:"", long version:""}

folder

{name:"docs", creation date:date "2013年12月18日水曜日 15:58:24", modification date:date "2013年12月18日水曜日 15:58:33", size:272378, folder:true, alias:false, package folder:false, visible:true, extension hidden:false, name extension:missing value, displayed name:"docs", default application:alias "Macintosh HD:System:Library:CoreServices:Finder.app:", kind:"フォルダ", folder window:{0, 0, 0, 0}, file type:"", file creator:""}

package folder

.app や .workflow もこの形式。

{name:"OpenInTerminal.workflow", creation date:date "2014年2月9日日曜日 17:30:33", modification date:date "2014年2月9日日曜日 17:30:33", size:69362, folder:true, alias:false, package folder:true, visible:true, extension hidden:true, name extension:"workflow", displayed name:"OpenInTerminal.workflow", default application:alias "Macintosh HD:Applications:Automator.app:", kind:"ワークフロー", short version:missing value, long version:missing value, bundle id:missing value, file type:"BNDL", file creator:"????", type identifier:"com.apple.automator-workflow", busy status:false}

入力がファイルかフォルダかを判別する

このあたりを参考に比較したり、サブルーチン化したり。

on run {input}
  set src to input
  --return info for src
  try
    -- file -b コマンドを利用する
    --set result to isDirectory(src)
    -- info for を利用する
    set result to isDirectoryRenew(src)
    return result
  end try
end run
-- file -b コマンドを利用する
on isDirectory(someItem)
  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
-- info for を利用する
on isDirectoryRenew(someItem)
  set isFolder to (folder of (info for someItem))
  set isPackageFolder to (package folder of (info for someItem))
  if isFolder and not isPackageFolder then return true
  return false
end isDirectoryRenew