スクリプト補足

前回に載せた「フォルダ名で、中身のファイルをリネームする」スクリプトですが、あまりにもちゃちゃっとブログ文中で済ませたので、補足しておきます。

 

ちなみに、私はアニメーター100%だった頃、コンピュータやプログラムとは真逆の人間だと周囲から思われていましたし、自分もプログラムなんてとてもじゃないが‥‥と思っていました。学校でコンピュータやプログラムを教わったことなど皆無でしたし。

 

でも、今はこんな‥‥です。

 

なので、本人の気概次第でプログラムの基礎くらいは習得できると思っています。プログラム言語よりも遥かに難解な日本語を話せるのですから。

 

で、前回のスクリプトは‥‥

 

var theFolder=Folder.selectDialog("フォルダを選択してください");
var theFiles=theFolder.getFiles("*_?????.tga");
for(var i=0;i<theFiles.length;i++){theFiles[i].rename(theFolder.name+"_"+theFiles[i].name.split("_")[theFiles[i].name.split("_").length-1]);}

 

‥‥の3行スクリプトでした。

*ブログの表示幅の都合で、自動回り込み改行で4行に見えることもありますが、実際は3行となります。

 

これに注釈を添えると‥‥

 

var theFolder=Folder.selectDialog("フォルダを選択してください");

 

ユーザにフォルダを選択してもらうよう催促するのが、Folder.selectDialog() です。選択したフォルダを記憶しておくために、変数「theFolder」に代入します。変数の名前はtheFolderでなくても構いませんが、予約された単語とは被らないようにします。「folderA」「target_folder」などでも大丈夫です。

 


var theFiles=theFolder.getFiles("*_?????.tga");

 

getFiles() は、文字通り、フォルダの中にあるファイルをゲットする命令です。ただし、ファイル全てをゲットしてしまうと、不要なファイルまでゲットしてしまう可能性も否めません。そこで、「連番ファイルだけを選び出す」ために、条件をつけます。

 

今回の連番のファイル名は、「親フォルダの名前」+「アンダーバー」と「数字5桁」と「ドット」と「TGA拡張子」で構成されていますので、その連番ファイルだけを選び出してゲットします。「選び出し」を可能にするのが、getFiles() の括弧内の指定です。

 

「*」は0文字以上の何らかの文字列、「?」は何らかの1文字を表し、その他はそのままの文字として認識されて、選び出しの条件となります。ゆえに、「*_?????.tga」で「a_00001.tga」などの連番ファイルだけを抜き出すことが可能になります。同じ条件で「zz_xx_cdefg.tga」も条件に引っかかることになりますが、映像制作の素材フォルダにはそのようなファイル名が含まれていないことがわかっていますので、甘い条件でも十分機能します。

 

もし「b_0001.tif」や「b_0122.tif」などの4桁&TIFF連番を抜き出したい場合は「*_????.tif」にすれば良いです。

 

もっと条件をユルくして、「*.???」なら、「b_0001.tif」も「a-ue_001.tga」「anim_06_231_t2_0048.dpx」でも、全部対象になります。「ドット&3文字拡張子」なら何でも抜き出せる‥‥というわけです。中身に何が入っているか、自分自身で確信があるのならそのくらいユルくてもOKですが、スクリプトプログラムを作った本人以外の他人が使う時は注意が必要です。

 


for(var i=0;i<theFiles.length;i++){theFiles[i].rename(theFolder.name+"_"+theFiles[i].name.split("_")[theFiles[i].name.split("_").length-1]);}

*ブログの表示幅の都合で、自動回り込み改行で2行に見えることもありますが、実際は1行となります。

 

for」は繰り返しを処理する構文で、プログラム初心者の「最初のハードル」と言えるかも知れません。「for(var i=0;i<theFiles.length;i++)」は、「まず最初に変数iにゼロを代入し、変数iが変数theFilesの中身の総数より小さい間は処理を繰り返し、繰り返しごとの最後に変数iに1をプラスしてループ先頭に戻る」という意味になります。

 

一方、変数theFilesの中身は、先ほどの「getFiles("*_?????.tga")」によって、TGAの連番ファイルが格納されているので、この、for構文で順番に中身を取り出して処理していきます。theFilesの中にあるTGA連番ファイルは、一番目のファイルを「theFiles[0]」、七番目のファイルは「theFiles[6]」というように「ゼロスタートに読み替えて」指定して取り出すことができます。

 

for構文において、変数iは、繰り返しごとに、0, 1, 2, 3, 4, ....と増えていくので、変数iを呼び出し番号として活用し、theFiles[i]のように用いれば、theFIlesの中身を順番に取り出すことが可能になります。

 

次に、theFiles[i]で呼び出した個々のTGA連番ファイルを、いよいよ、「rename()」命令でファイル名変更しますが、そのためには、新しいファイル名を、親フォルダの名前と古いファイル名を部分的に合体させて生成する必要があります。

 

変更後の名前は、「親フォルダの名前」+「アンダーバー」+「元の連番と拡張子」にしたいので‥‥

 

親フォルダの名前を得る>>theFolder.name

 

‥‥は簡単だとしても、面倒なのは‥‥

 

元のファイル名から連番と拡張子だけを得る>>「a_00001.tga」の「00001.tga」の部分

 

‥‥です。でも、映像制作では連番の前を「アンダーバーなどで区切る」のが一般的なので、それを有効活用します。つまり、ファイル名をアンダーバーで区切れば、「a」と「00001.tga」を分割=split() できます。

 

例えば、"a_b_c_d" という文字列があった場合、"a_b_c_d".split("_") を実行すると、["a","b","c","d"] という配列に分解されます。この配列から3番目の要素である "c" を抜き出したい場合、ゼロから数え直して、[2]という呼び出しかたで抜き出します。つまり、"a_b_c_d".split("_")[2] で "c" を抜き出せます。

 

なので、"a_00001.tga" から "00001.tga" を抜き出すには‥‥

 

"a_00001.tga".split("_")[1]

 

‥‥でうまくいきます。

 

しかし、今回は「a_00001.tga」でしたが、もし「a_un_00001.tga」みたいなファイル名だったら‥‥

 

"a_un_00001.tga".split("_")[1]

 

‥‥では「un」が抜き出されてしまいます。前方から数えて抜き出すのではなく、最後の要素を抜き出せば、必ず、「00001.tga」が抜き出せます。しかし、残念ながら、最後から数えるのに [-1] のような指定方法は通用しません。

 

なので、split() で分割した要素数を数えて、1スタートではなく0スタートで指定するために要素数からマイナス1すれば、最後の要素を指定して抜き出すことが可能になります。要素数を数えるには「length」を使います。

 

"a_00001.tga".split("_")["a_00001.tga".split("_").length-1]

 

"a_un_00001.tga".split("_")["a_un_00001.tga".split("_").length-1]

 

この方法なら、ちょっと文が長くて解りにくくなりますが、どの場合も確実に「00001.tga」を取り出すことができます。スクリプト文中ですと‥‥

 

theFiles[i].name.split("_")[theFiles[i].name.split("_").length-1]

 

‥‥という具合になります。

 

連番と拡張子が取り出せたのなら、あとは親フォルダの名前と合体させるだけです。アンダーバーも忘れずに。

 

theFolder.name+"_"+theFiles[i].name.split("_")[theFiles[i].name.split("_").length-1]

 

新しい名前を生成できたら、rename()」命令で実際にファイル名を変更して終了です。

*ブログの表示幅の都合で、自動回り込み改行で2行に見えることもありますが、実際は1行となります。

 

theFiles[i].rename(theFolder.name+"_"+theFiles[i].name.split("_")[theFiles[i].name.split("_").length-1])

 

 

実際に処理をすると、72ファイル程度のリネームなど「瞬殺」で処理終了です。

 

 

↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓

 

 

 

 

たった3行のプログラムですが、最後の行に「for」「rename()」「split()」などが一気に盛り込まれたので、ちょっと難しいようにも思えますが、落ち着いて、行頭から1つ1つ意味を理解して進めば、混乱することはありません。

 

リネームはこのやり方の他にもたくさん方法があります。今回は「親フォルダ名と元の連番&拡張子を合体させる」方針なので、上記の方法になりましたが、文字列の「置換」を使ったり、ソートしてリナンバーする方法も考えられます。

 

何か1つの段取りを守らないとリネームができないわけではなく、工夫次第で色々なアプローチを考えて実践できるのが、プログラムの「実は楽しいところ」です。

 

でも‥‥

 

工夫次第で色々なアプローチを考えて実践

 

‥‥って、絵を描いたり、話を考えたり、視覚効果を追加したり、音楽を作ったりすることと、何だか似てます。料理や運転、経営・経済などにも共通すること‥‥かも知れませんネ。

 

 

 

 

*追記:

今回の3行のサンプルスクリプトは、できるだけ簡潔にするために、例えば「ユーザがキャンセルボタンをクリックした」「フォルダの中身が空だった」などの「false」「null」「[ ]」「undfined」に対応する処理が全く書かれていません。その点に関しては、ESTKの元になっているJava Scriptの指南Webなどで独学してください。

 

例えば‥‥

 

main();

 

function main(){

var theFolder=Folder.selectDialog("フォルダを選択してください");

if (!theFolder) {return false;}

}

 

‥‥などのようにキャンセルに対する処理を施します。

 

 

 



calendar

S M T W T F S
    123
45678910
11121314151617
18192021222324
252627282930 
<< November 2018 >>

selected entries

categories

archives

profile

search this site.

others

mobile

qrcode

powered

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