ファイルの分別(後)

AppleScriptでファイルの分別をする後半です。ポイントは、

  • 大量処理の場面ではFinderを使わず、高速化する
  • カット名らしき文字列を含むファイルだけを対象とする
  • 特定のファイル形式(今回はDPX)だけを対象とする

‥‥です。つまり、PSDやQT、JPEGは対象から自動的に外し、さらにはDPXファイルと言えどもカット名を含まないものも自動的に対象外とします。

そこそこ長いスクリプト文なので、まずは下記に記します。

(*

まず、手始めに‥‥

本番のファイルを使うのはマズいし、テスト用にAfter Effectsで連番ファイルをレンダリングするのもバカらしいので、「ニセの画像ファイルの連番」を作ってしまいます.

*)

set folderName to do shell script "date +%y%m%d-%H%M%S" --日付&時間の文字列を生成
tell application "Finder" --Finderに命令を開始
    activate --Finderを最前面にする
    set theFolder to make new folder at desktop with properties {name:folderName} --先ほど生成した文字列を名前にしてフォルダ(=テストの作業場所)をデスクトップに作る
    open theFolder --作ったテスト用フォルダのウィンドウを開く
end tell --Finderへの命令終了

set folderPath to theFolder as Unicode text --フォルダをパス文字列に変換する
set countOfFiles to 720 --カット毎の連番ファイル数を指定
set dummyCutNames to {"dummy_02_165_t1", "dummy_01_014_t2", "anime_12_254a_t1", "dummy_02_098_t3", "test_a_211_t3", "test_a_211_t4"} --架空のカット名を生成

repeat with dummyCut in dummyCutNames --ダミーのカットで繰り返し処理
    repeat with i from 10001 to (10000 + countOfFiles) --10001から数え始めて指定ファイル数へ繰り返し処理
        set ofa to open for access file ((folderPath & dummyCut & "_" & ((characters 2 thru -1 of (i as text))) as Unicode text) & ".dpx") with write permission --テスト用フォルダ内にカット番号+4桁連番+拡張子の名前のダミーファイルを作ってアクセス開始
        write "dummyだよん" to ofa --dummyという文字列を書き込む(テキトーな文字)
        close access ofa --ファイルへのアクセスを終了する
    end repeat --繰り返し処理終了
end repeat --繰り返し処理終了

--テストフォルダの中には、5秒前後で数千個のファイル(自動処理のテスト用の偽ファイル)が生成された、はずです.

--故意に他の拡張子のファイルも数種類混ぜてみましょう
--名前でソートした際にごちゃごちゃになるよう、わざとイジワルな名前をつけて、スクリプトの耐久性を見ましょう
repeat with dummyFile in {"A-関係ないPhotoshopファイル.psd", "B-関係ないQuickTimeファイル.mov", "s_全く関係ないJPEGファイル.jpg", "Y_消し忘れたPNGファイル.png", "0-素材のイラレファイル.ai", "testで書き出したDPX.dpx"}
    set ofa to open for access file (folderPath & dummyFile) with write permission --偽ファイル
    write "dummyだよん" to ofa --dummyという文字列を書き込む(テキトーな文字)
    close access ofa --ファイルへのアクセスを終了する
end repeat



activate --このスクリプトを最前面にして
set theResult to display dialog ((length of dummyCutNames) as text) & "カットの合計" & ((countOfFiles * (length of dummyCutNames)) as text) & "ファイルを生成しました" with icon note buttons {"ここで止めとく", "分別を処理してみる"} default button 1 giving up after 20 --処理の続行を尋ねる
tell application "Finder" to activate --Finderを最前面にする(処理の様子を見せる)
if button returned of theResult is "ここで止めとく" then return --ユーザが中止を選択した場合は処理を中止


(*


これより以下がフォルダごとの分別処理です.
回りくどいトリッキーな事をしているように見えますが、「できるだけFinderを大量のファイルに関与させない」工夫ゆえです.

*)

set cutNameSliceStart to 1 --カット名を抜き出す開始番号(アンダースコアで区切った配列のスタート)
set cutNameSliceEnd to 4 --カット名を抜き出す終了番号(アンダースコアで区切った配列のエンド)
set nameExtension to ".dpx" as Unicode text --収拾するファイルの拡張子を設定
set AppleScript's text item delimiters to "_" as Unicode text --ファイル名のリスト分解に備える

set tryCount to 0 --検索ファイルのカウント
repeat --無限の繰り返し
    set tryCount to tryCount + 1 --検索ファイルのカウントを1つ増やす
    try --エラー発生を見越して(故意にエラーを発生させる)
        tell application "Finder" --Finderに命令
            set theFile to file tryCount of theFolder --分別のきっかけとなるファイルを指定
            set theFileName to (name of theFile) as Unicode text --ファイルの名前を取得
        end tell --Finderへの命令終了
    on error --ファイルを検索し終えた場合にエラーが出る
        activate --このスクリプトを最前面に呼び出して
        display dialog "処理が終了したようです.
       
ちゃんと分別されたか、Finderのウィンドウで確認してみてください.

分別対象以外のファイルはそのまま残っています." with icon note buttons {"OK"} default button 1 giving up after 15 --処理終了を報告する
        exit repeat --無限ループから脱出
    end try --故意エラーへの対応終了
   
    if theFileName ends with nameExtension then --もしファイルが対象ファイル形式だったら
        set nameArray to text items of theFileName --ファイル名をリスト(配列)分解
        set fileNameCheckIsOK to length of nameArray > cutNameSliceEnd --ファイル名が規定を満たすかをチェック
        if fileNameCheckIsOK then --もしファイル名が規定を満たす場合
            set tryCount to tryCount - 1 --検索ファイルのカウントを1つ戻す(カウントの空滑りを防止)
            set cutName to (items cutNameSliceStart thru cutNameSliceEnd of nameArray) as Unicode text --カット名をファイル名から抽出する
            do shell script "mkdir " & quoted form of POSIX path of (folderPath & cutName) --フォルダをシェルで作る
            do shell script "mv " & (quoted form of POSIX path of (folderPath & cutName)) & "_*" & nameExtension & " " & quoted form of POSIX path of (folderPath & cutName) --対象ファイルをカット名フォルダに移動する
        end if --ファイル名チェックの「もし」の範囲、ここまで
    end if --対象ファイル形式の「もし」の範囲、ここまで
end repeat --無限ループの範囲、ここまで

set AppleScript's text item delimiters to "" --リスト分解の設定を初期値に戻す

tell application "Finder" to activate --Finderを最前面にする

return tryCount --検索ファイルの最終カウントを結果として戻す


コメントを入れたおかげで、余計、長く感じられますが、まだシンプルなほうだとは思います。やっている事が、単にファイルの分別ですからネ。テスト用の偽物ファイルを作るところからやっているので、長くなっているのですネ。

動作中のスクリーンショットは、こんな感じ。

スクリプトを実行すると、デスクトップに日付のフォルダが自動生成され、その中に数秒後、テスト用のダミーファイルが大量生成されます。

5040個の連番ファイルと、故意に混ぜた関係のないファイル6個。変更日でソート表示されてるので、並びはバラバラですが、ウィンドウ下部の項目数に注目してください。





…実際に作ったのは、上記の通り、5040+6で5046ファイル。

「分別を処理してみる」ボタンをクリックすると、数秒後‥‥

‥‥のような感じで、思惑通り、カット名を持つ連番ファイルだけが、分別されました。イジワルな名前の混在にもメゲず、ちゃんとカット名連番だけを見分けて、新規フォルダを作って格納しています。

種類でソートすると、こんな感じ。

めでたく、終了。5046項目のごちゃまぜファイルが、数秒で、スッキリ、13項目に整理されました。


たとえ、以前にレンダリングしたQTファイルや、とりあえず置いといたJPEGファイルがあっても、「カット名を含む、DPX」以外は処理対象から外すので大丈夫なのです。

また、作品や話数がごっちゃになっていても、「カット名の命名規則に準じて」ファイルを選別するので、問題無いのです。

スクリプトの文中に目を通すと、AppleScript独特の表現もちらほら見えます。「AppleScript's text item delimiters」なんてのは、その最たるもので、私はこれが面倒でイヤなんですが、要は「テキストの要素を分解する文字」の事です。これを操作すると、文字列を任意の文字で分解できるようになります。

ファイルを分別するくだりは、目の前にあるものを処理して、もし対象外のものだったら、一歩進む‥‥という、何とも可愛い動作にしてあります。一歩進む‥‥とは、「自分のいる位置のカウントを1つ足す」という事ですが、AppleScriptには「++」なんてシャレたものはないので、set その変数 to その変数+1 みたいにして、地道に書きます。

Finderは言わば窓口。そこに大量の物品を持ち込んでもパニックになるだけです。窓口で簡単な手続きを済ませたら、後は頼りになるバックヤードでドカンと大量処理するのです。

しかし、AppleScriptに馴れていない人が、上記スクリプト文を読んでも、理解できないかも知れません。コメントだけ読んで、流れを汲んでもらえればと思います。文中の細かい説明はまたいずれ。

今回はダミーファイルまでも作るデモ的なスクリプトですが、文中後半の「ファイル分別ルーチン」を抜き出してちょっと手直しすれば、汎用性があって何度でも使い回しのできる、連番分別アプリケーションに育てる事ができます。

次回は、似たようなスクリプトを使って、「作業者にツッコミをいれる」スクリプトを作ってみます。データベースを使わなくても、スクリプト自身が判断して、「ほんとに、その尺で合ってる?」とユーザに確認してくるのです。

ではまた。


calendar

S M T W T F S
  12345
6789101112
13141516171819
20212223242526
2728293031  
<< August 2017 >>

selected entries

categories

archives

profile

search this site.

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM