2013/02/12

指定フォルダ以下のリソースフォーク削除

Mac特有のファイルとしてリソースフォークという物があります。Mac上ではデータファイルと合わせてひとつのファイルに見えるので、Macだけで使っていると気にならないのですが、時として不便なこともあります。

自分の場合は、過去に保存した大量の写真ファイルにカスタムアイコンが張り付いていたこと…。
今のOS Xでは512pxが最大ですが、以前は128pxでしたので、カスタムアイコンが拡大されボヤけてしまう。ならいっそカスタムアイコンの含まれるリソースフォークを削除してしまおうと思ったのですが、調べても最近はAutomatorで処理する話ばかり。
少しの量ならいいのですが、量が多いと時間がかかる上に途中で止まってしまったので、なんとかならないかと調べてみました。

コマンドのcpもmvも今やリソースフォークを含む処理しか出来ず、dittoにrsrcForkオプションもでいいのですが、dittoはコピー前提らしく、上書きの方法がないらしい…。
他にも調べて、リソースフォークを分離出来るsplitforksコマンドというのもあったのですが、分離後、rmで削除しても白紙アイコンになるだけでアイコンプレビューが出来ないままに…。
データフォークを調べたら、全くオリジナルと同じだったので、ファイルが壊れたわけでもないし…これはFinderのフラグがどこかに立っていると思い、また調べることに。

ひたすらググりまくって、ようやくxattrコマンドという物に当たりました。
見慣れないコマンドですが、どうやら10.5 Leopardから導入された拡張属性を操作する為のコマンドらしいです。
そしてリソースフォーク削除の
xattr -d com.apple.ResourceFork <ファイル>
ターミナルから実行したのですが、結果は変わらず白紙アイコンになっただけ…。
またターミナルからls -l@と入力して拡張属性を調べた所、com.apple.FinderInfoというものも付いていることが判明し、それも削除することで、めでたくアイコンプレビューが表示されるようになりました。

それを組み込んだAppleScriptを作りましたので、何かのご参考にでもなれば…。
フォルダーの再帰処理(フォルダ内のフォルダ〜入れ子になっている物の処理)はぴよまるソフトウェアさんの AS Hole(AppleScriptの穴) By Piyomaru Software » 再帰でファイルをカウント » Blog Archive から拝借させて頂きました。


on run
set theList to choose folder
set countFiles to 0
--set theList to contents of item 1 of theList
tell application "Finder"
set folderList to every folder of theList
set fileList to every file of theList
processfiles(fileList) of me
repeat with eachFolder in folderList
processFolders(eachFolder) of me
end repeat
end tell
end run

on processfiles(thisList)
delLabel(thisList) of me
end processfiles

on processFolders(thisfolder)
tell application "Finder"
set thesefiles to files of thisfolder
processfiles(thesefiles) of me
set thesefolders to folders of thisfolder
repeat with thatfolder in thesefolders
processFolders(thatfolder) of me
end repeat
end tell
end processFolders

on delLabel(thisList)
tell application "Finder"
repeat with aFile in thisList
--ここから処理内容
set objPath to POSIX path of (aFile as alias)
try
do shell script "xattr -d com.apple.FinderInfo " & quoted form of objPath
do shell script "xattr -d com.apple.ResourceFork " & quoted form of objPath
end try
--ここまで処理内容
end repeat
end tell
end delLabel



AppleScriptエディタにコピペして使ってください。
指定フォルダ以下のリソースフォークとFinder拡張属性を削除します。
それら属性がなかった場合、エラー回避は特に組んでいませんので、エラーがイベントに表示されますが、問題ありません。

もうひとつ…軽い方。
再帰的には処理しませんので、画像だけの入ったフォルダーを指定してください。


set objsFld to choose folder
set objsPath to POSIX path of objsFld
tell application "Finder"
tell folder objsFld
set objs to name of every file
end tell
end tell
repeat with obj in objs
try
do shell script "xattr -d com.apple.FinderInfo " & quoted form of (objsPath & obj)
do shell script "xattr -d com.apple.ResourceFork " & quoted form of (objsPath & obj)
end try
end repeat