Groovyのコマンドライン実行を拡張

2019-02-22未分類

何度か書いているけれども、家で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

2019-02-22未分類