ゲンゾウ用ポストイット

Java、Groovy、Linux関連の備忘録

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を作成

一番よく使う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

結構便利。

広告を非表示にする