2011年8月14日日曜日

2作目Alfred拡張、今度は期待できる!爆速リネームアプリ、Light Renamer!!

この間ご紹介したキーボードランチャAlfredの拡張、2作目作りました!

今回はかなりいい出来!!(前回が前回なだけに) 間違いなく便利です!

その名もLight Renamer!Alfredから爆速で高性能なリネームが出来る!

これは見なきゃ損!使わなきゃ損!ではさっそくご紹介します!(`・ω・´)


追記(110823)

一番下に直接コード貼りました。

たぶん、AlfredのPowerpackじゃないと見れないと思うので。

近いうち、もっと分かりやすい方法を載せますので、Alfredの便利さを心待ちにしてください(`・ω・´)


動画にしてみました!多分これが一番分かりやすいんじゃないかと思います。

ピンぼけみたいになってますが、挙動はこんな感じです。キャプチャしながらだからCPUフル回転してるので、実際はもっと速いです。

最後のオマケAlfred拡張も近いうち記事あげますー( ´ ▽ ` )ノ



一晩かかったんだし、まずは自慢させてください


・・・なんか通販みたいだったで普通にいきましょう。

とりあえず、モノを見てもらったほうが早いので、こちらをどうぞ。


Light Renamer


この拡張をざっくり説明すると、Finderで選択中の項目(ファイル/フォルダ両方)を、複数のパラメータを持たせてリネームします。

例えば、連番をつけたり、日付をつけたり、親フォルダの名前を参照したり、という感じです。

一連の流れを見てもらえば、なお分かりやすいかと思います。


1


まず、Finderで複数の項目を選択します。

見づらいですが、自炊した漫画で100項目掴みました。


2


おもむろにAlfredを呼び出します。僕はcontrol + space。

そして、"re fol,面白いよ!,n"と入力。

これはAlfredからパラメータを送るルールです。この辺はあとでご紹介。


3


ほい!!実行して3秒ほど、選択していたファイルがリネームされました!

"BLOOD+ 03_面白いよ!_001".jpg、完璧です!!

これは送ったパラメータ、"re fol,面白いよ!,n"で指定した内容となっています。

当然コレ以外のパラメータも送れますし、パラメータの順番も自由自在です。

リネームは名前昇順で実行されるので、連番に狂いもありません。

どうでしょう、なかなか使えそうな機能じゃないでしょうか。


Light Renamerはここが凄い!


では、このほかにどんなリネームが出来るのか。パラメータの説明と合わせて紹介します。

先ほどのパラメータの内容を紐解くと、こんな感じになっています。

re_fol,面白いよ!,n



  • re → AlfredからLight Renamerを呼び出すコマンド。必須です。

  • _ → 半角スペース。見えないので_書きましたが、実際は空白です。

  • fol → 親フォルダ名を表すパラメータ。[定数]

  • 面白いよ! → 設定していないパラメータ。要するに好きに使える文字列。[定数]

  • n → 連番を表すパラメータ。三桁だけど二桁、一桁もある。[変数]

  • , → それぞれのパラメータを区切る文字。これは固定してます。


このようにパラメータを与えることで、好きな構成の名前に変えられるという具合です。

このほかにも、下のパラメータも用意しています。



  • t → 日付を表すパラメータ。yymmddの記述で日付が入ります。[定数]

  • cur → リネーム前の名前を表すパラメータ。[変数]


これらのパラメータを好きな順番に並べれば、

re cur,t

→朝食_110813.jpg, 昼食_110813.jpg, 夕食_110813.jpg, 総カロリー_110813.txt,...

のような、食事ログのまとめ、

re n,沖縄旅行,t

→001_沖縄旅行_110813.jpg, 002_沖縄旅行_110813.avi, 003_沖縄旅行_110813.mp3,...

のような、旅行のデータまとめなどが、とても手軽に行えます。

僕が例で出した自炊ファイルのまとめは、一番ポピュラーな使いかたかと思います。

今挙げた食事ログのまとめを見ると分かりますが、パラメータは2つでも1つでも問題ありません。

その場合、区切りの","は省略して構いません。("re n" or "re n,t"の実用性は凄まじいです。)

拡張子を保護してリネームするので、いろんなファイルが混ざっていても大丈夫。

フォルダも同じ方法でリネームするので、ファイルとフォルダが混ざっていても大丈夫。

そしてそして、各パラメータには"t"、"n"、"fol"などが割り当てられてますが、これは設定で好きな文字に変更出来ます。

ついでに区切り文字の"_"も好きに変更出来ます。もうなんでもアリなレベル。

スクリプト内に"チョチョイと設定"という設定部分を作っているので、その値を変えてもらえばOK。

キーボードランチャからチョロっと叩くだけで、ここまで出来ていいのかと疑います。


自分で言うのもなんですが、これだけ出来れば普段づかいには十分でしょう。

もう簡単なリネームなら、専用アプリは必要ありません。

是非みなさんも使ってみてください!!

Alfredでの使いかたは、前回の記事に書いてますのでそちらをどうぞ。


ついでではありますが、Growlの通知もつけました。リネーム完了後、ポンと出ます。

ただ、これはエラー報告では無いです。ただ”出てくるだけ”。自己満足。

音などを設定したい人は、一度このスクリプトでGrowlをポップアップさせてから、

システム環境設定→Growl→アプリケーション→Light Renamerから設定してください。

「そんなんいらんわ」「Growl入れてない」という人は、スクリプト内に書いてある"チョチョイと設定"から、growl_runの初期値を"false"にしてください。

よかったらエラー処理にでも役立たせてくれれば幸いです。


いくつか注意点


使う上で、頭の片隅に覚えておいて欲しい項目がいくつか。

まず、Backgoundのチェックボックスを"ON"、Actionを"OFF"にしてください。

Backgroundが"OFF"でもリネームは出来ますが、リネーム中Alfredがほぼ固まります。

本末転倒もはなはだしいです。


そしてこれが大切なんですが、リネームするファイル/フォルダまでのフルパス(自身も含む)に、"."を含んだものはリネーム出来ません。

拡張子はOKなんですが、二重拡張子やフォルダに"."が入ったものは対応していません。(.tar.gzなど)

普段僕が扱わない拡張子は頭から抜けてました、ごめんなさい(´・ω・`)

その辺は他の専用ソフトでリネームするか、スクリプトを書き換えてください。


最後に。使っていると分かることなんですが、パラメータには[定数]と[変数]があります。

上のリストの末尾に書いてあるのがソレです。

連番、元のファイル名が変数となっており、この2つはファイルごとに値が違います。

それ以外の親フォルダ名、日付、任意の文字列は、常に一定の値が入ります。

もうピンときたでしょうが、定数のパラメータだけでリネームを実行すると、2つ目のリネーム処理でファイル名が重複してしまうため、リネームされません。

まあ、それでもエラーは吐かないのでリネームは素直に終了しますが、最初のファイルだけリネームされてしまうという危なっかしい状態になります。

実際には拡張子が違えばリネームは行えるので一概ではありませんが、こういった側面があることを知っておいてください。


あとがき - Alfredならではの拡張とは


"Light Renamer"を作って思ったことコーナー。このあとがき、恒例になりそうです。

前回のタイマーも一応Alfred用の作りでしたが、今回のは完全にAlfred専用な感じで大満足。

というのは、キーボードランチャからパラメータを直接投げるという挙動についてです。

この部分を踏まえないと、「それ別のやり方のが速くね?」ってことに成りかねません。

速さがすべてとは言いませんが、キーボードランチャを使う人は割とそういう考えではないでしょうか。(僕だけか?)

Light Renamerは、力ではワイルドカードや正規表現でゴリゴリとリネーム出来るアプリには手も足も出ませんが、こと速さにおいては格別です。

キーボードランチャに似合った、適材適所な拡張機能と言っていいでしょう。

まあ中身は相変わらずズタボロですが、Alfredの考えはこんな感じなのかなと思います。

とまあ、さすがにいい加減自己満過ぎるので、そろそろ次のアプリの構想に移ります(笑)


コードを追記


コメント込みだとすごい量だな・・・



(*
Light Renamer
すいとー (@suito1942)
http://www.hw2-suito.com/

*概要
Alfredから使える、簡易リネームスクリプトです。
Finderで選択している項目をリネームします。
ファイル/フォルダ両用です。複数選択した場合、名前昇順で実行されます。
入力文字を","で区切り、さまざまなパラメータを最大3つまで組み合わせることが出来ます。
各パラメータは下記。(Syntaxは変更可)

Syntax:$任意の文字列 [定数]
任意の文字列。ファイル名に使えない文字列は含まないでください。
Syntax:$t [定数]
日時を入力します。記述はyymmdd。(例:110813)
Syntax:$n [変数]
連番を入力します。デフォルトの記述は三桁。(例:001,002,003,...)
一桁、二桁もオプションで用意しています。変更したい場合は最後の"カウントアップ"を編集してください。
Syntax:$fol [定数]
親フォルダ名を入力します。
Syntax:$cur [変数]
リネーム前のファイル名を入力します。

*使いかた
Alfredのkeywordを入力し(デフォルトは"re")、returnもしくは" "を押して、それぞれのパラメータを","で区切って入力します。
それぞれのパラメータは"_"で区切られます。
少し分かりづらいので、いくつかの実用例を紹介します。

1、"re n,沖縄旅行,t" と入力 [対象:沖縄旅行のいろんなデータ]
→001_沖縄旅行_110813.jpg, 002_沖縄旅行_110813.avi, 003_沖縄旅行_110813.mp3,...
2、"re cur,t" と入力 [対象:今日食べた食事のデータ]
→朝食_110813.jpg, 昼食_110813.jpg, おやつ_110813,jpg, 夕食_110813.jpg, 総カロリー_110813.txt,...
3、"re fol,cur" と入力 [対象:「よつばと!1巻」を自炊したデータ]
→よつばと!1巻_001.jpg, よつばと!1巻_002.jpg, よつばと!1巻_003.jpg,...

パラメータは最大3つまで。1つでもリネームは出来ます。(実際、"re n"はよく使うと思います。)
ファイル、フォルダともに、同様の処理をします。(拡張子は保護します。)
各パラメータを呼び出すSyntaxと、各パラメータを区切る"_"は、下記から変更可能です。("チョチョイと設定"から〜まで)
使いやすい文字に変更してみてください。

*注意点
Backgoundのチェックボックスを"ON"、Actionを"OFF"にしてください。

スクリプトの仕様上、下記のファイル、フォルダ名のものはリネーム出来ません。
"."を含むファイル、フォルダ名(階層含んですべて)
二重拡張子のファイルなどは、別の手段でリネームしてください。

各パラメータには、回数を重ねるごとに内容が変更されるものと、変更されないものがあります。
Syntaxの欄にある、[定数],[変数]がそれにあたります。(拡張子は準変数としておきます。)
連番、リネーム前ファイル名は毎回変わりますが、それ以外はずっと同じ文字列が入ります。
[定数]のパラメータのみで構成すると、2つ目のリネーム処理でファイル名の重複によるエラーとなります。
「ミスった!・・・あれ?元のファイル名なんだっけ?」と陥りやすいので、気をつけてください。

*おまけ
ついでにGrowlの通知もつけました。リネーム完了後、ポップアップします。
ただし、エラー報告などではありません。ただ"出てくるだけ"です。
音などを設定したい人は、一度このスクリプトでGrowlをポップアップさせてから、
システム環境設定→Growl→アプリケーション→Light Renamerから設定してください。
「そんなんいらんわ」「Growl入れてない」という人は、"チョチョイと設定"から、
growl_runの値を"false"にしてください。
上手くエラー処理に役立たせてくれれば幸いです。
*)

on alfred_script(q)
set q to q as text

--チョチョイと設定 ここから
--""内を変えるとSyntaxを変更できます
set t to "t" --日付のSyntax
set n to "n" --連番のSyntax
set fol to "fol" --親フォルダのSyntax
set cur to "cur" --現在のファイル名のSyntax
set separator to "_" --各パラメータを区切る文字
set growl_run to "true" --いる場合は"true"、いらない場合は"false"
--チョチョイと設定 ここまで

--フォルダ名取得
tell application "Finder"
tell window 1
set parent_path to target as alias as text
end tell
try
set oldDelim to AppleScript's text item delimiters
set AppleScript's text item delimiters to ":"
set parent_list to ""
repeat with i from 1 to (count text item of parent_path)
set demo to text item i of parent_path
set parent_list to parent_list & demo as list
end repeat
end try
set demo to count of parent_list
set demo to demo - 1
set folder_name to text item demo of parent_list
set AppleScript's text item delimiters to oldDelim
end tell

--その他もろもろ
set current_day to (do shell script "date '+%y%m%d'")
set item_num to 0
set count_type to ""
set current_type to ""
set current_name to ""

--引数の判定と代入、count_typeとcurrent_typeは後の判定用
set my_parameter to q
set my_parameter to my_parameter & "," & "," --引数が少ない時用
set oldDelim to AppleScript's text item delimiters
set AppleScript's text item delimiters to ","

if text item 1 of my_parameter = t then
set A to current_day
else if text item 1 of my_parameter = n then
set A to item_num
set count_type to "A"
else if text item 1 of my_parameter = cur then
set A to ""
set current_type to "A"
else if text item 1 of my_parameter = fol then
set A to folder_name
else if text item 1 of my_parameter ≠ "" then
set A to text item 1 of my_parameter
else
set A to ""
end if

if text item 2 of my_parameter = t then
set B to current_day
else if text item 2 of my_parameter = n then
set B to item_num
set count_type to "B"
else if text item 2 of my_parameter = cur then
set B to ""
set current_type to "B"
else if text item 2 of my_parameter = fol then
set B to folder_name
else if text item 2 of my_parameter ≠ "" then
set B to text item 2 of my_parameter
else
set B to ""
end if

if text item 3 of my_parameter = t then
set C to current_day
else if text item 3 of my_parameter = n then
set C to item_num
set count_type to "C"
else if text item 3 of my_parameter = cur then
set C to ""
set current_type to "C"
else if text item 3 of my_parameter = fol then
set C to folder_name
else if text item 3 of my_parameter ≠ "" then
set C to text item 3 of my_parameter
else
set C to ""
end if
set AppleScript's text item delimiters to oldDelim

tell application "Finder"
set g_i to 0 --遊びで使ってます、よかったらエラー処理に役立たせてください
repeat with select_item in (selection as list)
set file_path to select_item as text
set g_i to g_i + 1
if file_path contains "." then --ファイルのとき(拡張子の有無を判定。二重拡張子、親フォルダに"."がある場合は成り立たない理由)
set oldDelim to AppleScript's text item delimiters
set AppleScript's text item delimiters to "."
set item_ext to last text item of file_path --拡張子取得
set current_name_text to text item 1 of file_path

try
set AppleScript's text item delimiters to ":"
set current_name_list to ""
repeat with ii from 1 to (count text item of current_name_text)
set list_demo to text item ii of current_name_text
set current_name_list to current_name_list & list_demo as list
end repeat
end try
set current_name to last text item of current_name_list --現在の名前取得
set AppleScript's text item delimiters to oldDelim

--変数になるcurとnはrepeat内
--引数にcurがあったとき
if current_type = "A" then
set A to current_name
else if current_type = "B" then
set B to current_name
else if current_type = "C" then
set C to current_name
end if

--引数にnがあったとき
if count_type = "A" then
set A to my count_up(A)
else if count_type = "B" then
set B to my count_up(B)
else if count_type = "C" then
set C to my count_up(C)
end if

--リネーム
if C = "" and B = "" then
set name of select_item to A & "." & item_ext as Unicode text
else if C = "" then
set name of select_item to A & separator & B & "." & item_ext as Unicode text
else
set name of select_item to A & separator & B & separator & C & "." & item_ext as Unicode text
end if
else --フォルダのとき
try
set AppleScript's text item delimiters to ":"
set current_name_list to ""
repeat with ii from 1 to (count text item of file_path)
set list_demo to text item ii of file_path
set current_name_list to current_name_list & list_demo as list
end repeat
end try
set current_name to last text item of current_name_list --現在の名前取得
set AppleScript's text item delimiters to oldDelim

--変数になるcurとnはrepeat内
--引数にcurがあったとき
if current_type = "A" then
set A to current_name
else if current_type = "B" then
set B to current_name
else if current_type = "C" then
set C to current_name
end if

--引数にnがあったとき
if count_type = "A" then
set A to my count_up(A)
else if count_type = "B" then
set B to my count_up(B)
else if count_type = "C" then
set C to my count_up(C)
end if

--リネーム
if C = "" and B = "" then
set name of select_item to A as Unicode text
else if C = "" then
set name of select_item to A & separator & B as Unicode text
else
set name of select_item to A & separator & B & separator & C as Unicode text
end if
end if
end repeat
end tell
if growl_run = "true" then
set g_i to "total " & g_i & " items" as text
my growlRegister()
growlNotify("End Run Rename", g_i)
end if
end alfred_script

--サブルーチン
--カウントアップ
-- 一桁にする・・・[2],[3]をコメントアウト
-- 二桁にする・・・[3]をコメントアウト
-- 三桁にする・・・[2]をコメントアウト
-- (コメントアウトは行頭に"--"をつけてください)
to count_up(type)
set type to type + 1 -- [1]
--set type to text -2 thru -1 of ("0" & type) -- [2]
set type to text -3 thru -1 of ("00" & type) -- [3]
return type
end count_up

--Growlサブルーチン
--エラーの方は使ってません。よかったらどこかに設置してください。
using terms from application "GrowlHelperApp"
on growlRegister()
tell application "GrowlHelperApp"
register as application "Light Renamer" all notifications {"Notification"} default notifications {"Notification"} icon of application "Alfred.app"
end tell
end growlRegister
on growlRegister_error()
tell application "GrowlHelperApp"
register as application "Light Renamer error" all notifications {"Alert"} default notifications {"Alert"} icon of application "Alfred.app"
end tell
end growlRegister_error
on growlNotify(grrTitle, grrDescription)
tell application "GrowlHelperApp"
notify with name "Notification" title grrTitle description grrDescription application name "Light Renamer"
end tell
end growlNotify
on growlNotify_error(grrTitle, grrDescription)
tell application "GrowlHelperApp"
notify with name "Alert" title grrTitle description grrDescription application name "Light Renamer error"
end tell
end growlNotify_error
end using terms from

1 件のコメント:

  1. Thank you for your blog post.Really looking forward to read more. Really Cool.

    返信削除