読者です 読者をやめる 読者になる 読者になる

最近作った小さなPerlスクリプト3点

ここ1〜2週間、とくに忙しい感じだったが、そのストレスを反転させるようにいくつかPerl製のツールを書いていた。

1つめは、dirmove という名前でレポジトリは以下。
GitHub - note103/dirmove

2つめは、rcopy.pl という名前でレポジトリは以下。
GitHub - note103/rcopy

3つめは、delete.pl という名前でレポジトリは以下。
GitHub - note103/delete

いずれもコマンドライン操作に関するツールである。
それぞれ、簡単に解説してみたい。

dirmove

最初のこれは、ディレクトリ間をフイフイ気楽に移動するためのもの。
f:id:note103:20160412230105g:plain
f:id:note103:20160412230132g:plain

前者はpecoを、後者はsentakuという、それぞれコマンドラインツールを使っている。
それらについては以下レポジトリをご参照。

元々は、VimプラグインのVimfilerを使ったディレクトリ移動が大変心地よくて、

f:id:note103:20160412230909g:plain

これは画面上方でディレクトリ移動、そこで選択したものが下方半分に出てくる、という状況なのだけど、Vimプラグインなので(というか)その上方での移動がh,j,k,lの4キーでサクサクできる。

で、同じようなことをターミナルでもできないかなあ、と思ったのだった。

で、思いついたのは前回のエントリーで紹介した、ファイルコピーするための小スクリプトにおいてsentakuとPerlをつなげたということで。
note103.hateblo.jp

これの前半で試みた、ディレクトリ選択の部分だけ切り出せばいいのでは、と思った。

そしてそのついでに、そのツールでやったのと同様にpeco使用版も機能として取り入れた。
というか、たぶんメジャーなのはpecoの方なので、ツールの打ち出し方としてはむしろpecoをメインで見せているのだけど、使用感がVimfilerに近いのはsentakuの方なので、個人的にはそちらをよく使っている。

※ただし、ディレクトリ内のアイテム数が多い場合にはやはりインクリメンタルに選択できたほうがラクなので、そういう場合は潔くpecoを使う。

rcopy

そして、その前回紹介したツールを少し洗練させて、また上記のディレクトリ選択(移動)機能をカットしたのがこのツール

f:id:note103:20160412232247g:plain
(コマンド呼び出しのエイリアスは「r」)

前回紹介した時点では、単純にファイルをコピーするだけのものだったが、現バージョンではディレクトリも中身のファイルごとコピーできるようになっている。

名称も前回は「cpg(copy generator)」とか言っていたが、再帰的なコピーが可能になったので「rcopy」とした。(recursive-copy)

delete

最後はこれ。

f:id:note103:20160412232628g:plain
(コマンド呼び出しのエイリアスは「d」)

コマンドラインでのファイル/ディレクトリ削除には、以前紹介したこれを今でも多用しているが、
note103.hateblo.jp

これは対象のファイルを一つだけ、または複数扱いたければワイルドカードなどを使って指定しなければいけないので(GUIではないのでその前提でよいのだが)、複数の似たような名前の特徴をもったファイル(/ディレクトリ)をざっくり捨てたい、という時にはちょっと手間だなあ、と思っていた。

で、その辺を解消する方法として、そのようなものを書いてみた。

これの場合、たとえばディレクトリ直下に以下のようなアイテムがあったとして、

2016-04-10_fruit_orange.txt
2016-04-11_fruit_apple.txt
2016-04-11_fruit_grape.txt
2016-04-13_fruit_lemon.txt
2016-04-14_fruit_banana.txt

もしtrashで3&4行目だけを削除したいと思ったら、

$ trash 2016-04-11_fruit_g* 2016-04-13*

などとする必要があるが、こちらのツールの場合は最初のダイアログで「f」(ファイル)を選んで、その後の問いかけ(「Put the target words.」)に対して

grape lemon

または

_g _l

とだけ入れれば、それらが消える。

というのは、このツールは指定した文字を含むファイルを探してくれるからで、また、もしその指定を間違えても、その後に一旦確認ダイアログが出てくるので、そこで意図しないファイルを当ててしまったことに気づいたらキャンセルもできる。

デメリットとしては、上記のrcopyもそうだが、やはり対話型なので、そのやり取りがちょっとタルイと感じることもある。
なので、対象がそれほど複雑な名前でない場合には、これまでどおりtrashでサクッと削除し、上記のような煩雑な対象の場合にはこれを立ち上げて、目についた特徴的な数文字だけを指定するようにしている。

謝辞&告知&まとめ

これらはいずれも、最初に作り始めてからせいぜい10日程度、短いものでは数日前に着想したばかりだが、それでも個人用途でけっこう使っている。

dirmoveを作った際には、まずPerlスクリプトからpecoを呼んで、その中で目当てのディレクトリ名(文字列)を取り出すまではスムーズに進んだが、コードの実行が終わると実行前のディレクトリから動いていない、という問題でハマった。

これはどうやら典型的なハマり方というか、検索すると同じようなことを言っている人が少なくなかったが、現在準備中のPerl入学式の公開用チャットでメンバーにそのことを質問してみたら、いろいろ具体的な知見が集まってきて参考になった。
(とくにシェルスクリプト関連でQiitaの大量ストックを獲得している @xtetsuji さんにはサンプルコードまで頂いて多謝です)

ちなみに、Perl入学式は2013年の8月、その年のシーズン途中(全6回中第3回補講)からまったくの素人として参加して、そのまま自分もサポーターとして関わっているプログラミング&Perl初心者用の無料講習コミュニティだが、メンバーにはこのように何年にもわたって、さらっと質問したことにさらっと答えて頂いて、現場の講義はもちろんだが、それ以外の場面でも本当に助けてもらっている。
この場を借りて、あらためて感謝の気持ちを伝えたい。

そのPerl入学式は東京、大阪、福岡、そして今年からは沖縄も加わり、それら各地で1〜2ヶ月に一度のペースで開催されているので、まだまったくプログラミングに触れたことがないけど興味ある!とか、Perlって使う機会なかったけど一回触ってみようかなあ〜とか思ってる人は参加してみるといいと思う。

ちょうど東京編の2016年度第1回の開催予定が数日前に告知されたところで、5/14(土)に五反田で行われる。
perl-entrance-tokyo.doorkeeper.jp

その他、詳しくは公式サイト&公式ブログをご参照。

話を戻すと、僕は基本的に自分が使いたいもの、自分が使うとラクになれそうなもの、自分が楽しくなれそうなもの、自分の役立ちそうなもの、というのを作っている。
上記3点は、ひとまず現時点ではそれになりつつある気がする。

以前に作った&ここで紹介したいくつかのツールも、けっこういまだに使っていて、それらもちゃんとしたレポジトリに分岐したいと考えているので、もしその辺が整理できたらあらためて紹介してみたい。