Groovyのコマンドライン実行を拡張
何度か書いているけれども、家でLinux、会社でCygwinという環境で少しずつなれてきました。ファイル名や中身の置換もコマンドラインから実行することも多いのですが、
groovy -e "..."
にて実行する場合はやはりタイプ量が多い気がします。これを減らすべく、groovyコマンドを拡張してみた。
まずは新しいコマンド groovyx
作成
新しい groovyx
というコマンドを作成してみる。内容は非常に簡単。
#!/bin/bash
groovy -cp ~/bin -e "Extensions.main(args);$1"
~/bin
フォルダに配置されている Extensions.groovy
を実行した後で、コマンドラインで指定されたスクリプトを実行するというもの。もちろん ~/bin
フォルダである必要はありません。 Extensions.groovy
というファイル名である必要もなしです。
では、 Extensions.groovy
というファイルの役割は?
こちらのソースコードでいくつかの既存クラスを拡張し、メソッドを追加します。
Extensions.groovyを作成
一番よく使うFileクラスを拡張してみる。僕は以下のような内容の拡張を行った。
#!/usr/bin/env groovy
File.metaClass.define {
ls {
delegate.listFiles().each {
println it.name
}
}
move { dirpath ->
delegate.renameTo(new File(dirpath.toString() + File.separator + delegate.name))
}
copy { dirpath ->
new File(dirpath.toString() + File.separator + delegate.name) << delegate.readBytes()
}
rename { newname ->
delegate.renameTo(new File(delegate.parent + File.separator + newname))
}
eachNormalFileRecurse { closure, ignoreDotFile = true ->
delegate.eachFileRecurse {
if (it.file && !(ignoreDotFile && it.path.contains(File.separator + "."))) {
closure(it)
}
}
}
getLastModifiedDate {
new Date(delegate.lastModified())
}
}
File.metaClass."static".load = { path ->
new File(path)
}
File.metaClass."static".getCurrent = {
new File(".")
}
詳細は省略です。
実行してみる
以下のようにして実行します。
その1
$ groovyx.sh "File.current.eachNormalFileRecurse{ println it }"
./00010.MTS
./00013.MTS
./00009.MTS
./00016.MTS
./00004.MTS
./00008.MTS
./00002.MTS
./00014.MTS
./00011.MTS
./00003.MTS
./00007.MTS
./00017.MTS
./00015.MTS
./00018.MTS
./00006.MTS
./00005.MTS
./00012.MTS
./00000.MTS
./00019.MTS
その2
$ groovyx.sh "File.current.eachNormalFileRecurse{ println it.name + ' ' + it.lastModifiedDate.format('yyyy/MM/dd hh:mm:ss') }"
00010.MTS 2009/07/30 07:25:48
00013.MTS 2009/08/04 08:25:02
00009.MTS 2009/07/25 05:38:14
00016.MTS 2009/08/09 12:49:08
00004.MTS 2009/07/01 09:27:04
00008.MTS 2009/07/21 06:51:20
00002.MTS 2009/06/13 10:57:46
00014.MTS 2009/08/05 08:31:18
00011.MTS 2009/07/30 08:00:56
00003.MTS 2009/06/13 11:00:02
00007.MTS 2009/07/20 06:32:04
00017.MTS 2009/08/15 11:07:04
00015.MTS 2009/08/07 01:10:24
00018.MTS 2009/08/15 11:14:22
00006.MTS 2009/07/06 02:23:02
00005.MTS 2009/07/01 07:20:56
00012.MTS 2009/08/02 08:18:28
00000.MTS 2009/05/26 09:03:22
00019.MTS 2009/08/15 11:56:18
その3
$ groovyx.sh "File.current.eachNormalFileRecurse{ it.rename(it.lastModifiedDate.format('yyyy_MM_dd-hh_mm') + '.MTS') }"
$ ls -l
2009_05_26-09_03.MTS
2009_06_13-10_57.MTS
2009_06_13-11_00.MTS
2009_07_01-07_20.MTS
2009_07_01-09_27.MTS
2009_07_06-02_23.MTS
2009_07_20-06_32.MTS
2009_07_21-06_51.MTS
2009_07_25-05_38.MTS
2009_07_30-07_25.MTS
2009_07_30-08_00.MTS
2009_08_02-08_18.MTS
2009_08_04-08_25.MTS
2009_08_05-08_31.MTS
2009_08_07-01_10.MTS
2009_08_09-12_49.MTS
2009_08_15-11_07.MTS
2009_08_15-11_14.MTS
2009_08_15-11_56.MTS
ディスカッション
コメント一覧
まだ、コメントがありません