ファイルやディレクトリを対話形式でcp, mv, deleteなどするツールをPerlで書いた
以前に以下の記事で、rcopy.pl delete.pl という小さいツールを作ったと書いたが、
note103.hateblo.jp
それはそれで結構重宝していたのだけど(ついでに言うと同時に紹介した dirmove というのもひき続きかなり使ってる)、似たような感じでファイルやディレクトリを簡単にリネームしたり、複数ファイルを一度に移動(mv)したりしたくなったので、それらをまとめて扱えるツールに書き換えてみた。
使い方としては、メインファイルであるところの crmd.pl と、後述の各機能を表す引数を一緒に指定する。
たとえば rcopy の機能を使う場合には、引数として「c」を付ける。
$ perl crmd.pl c
以下、簡単に各機能を説明するが、DEMO動画内では上記コマンドではなく、エイリアスでそれぞれ「c, r, m, d」を設定している。
rcopy
まずは前回紹介したコピー機能。ひとつの対象を、ひとつまたは複数の別名アイテムにコピーする。
この際、対象がディレクトリであれば、中身ごとコピーしていく。
DEMO: rcopy
strawberryディレクトリをbanana, banana-bread にコピーしていく際、元々strawberryディレクトリに入っていたstrawberry.txtも一緒にコピーされていく。
rname
今回の変更の目玉というか、そもそもこれを使いたい状況が頻出したので改良に手を付けた。
上記のコピー機能の場合、元のファイルが当然残るので、「単にリネームしたいだけなんだよなあ」という時にはコピーした後にわざわざ元ファイルを削除しなければならず、それが面倒だった。
(その削除時にも一応、後述のデリート機能をドッグフーディング的に使うわけだが)
なので、変更の指定方法などは上記のコピーとほぼ同じ方式にしつつ、ただしこれはコピーではないリネームなので、上記のコピーの方が「1→多」に変換できることに対して、こっちは「変更前のファイル→変更後のファイル」という、あくまで「1→1」の変換である。
まあ、それだけといえばそれだけの道具だが、ぼくはファイルやディレクトリのリネームをかなり頻繁にやるので(なぜだ?)便利に使っている。
DEMO: rname
rmove
当初は上記のリネーム機能が、Linuxコマンドにおけるmvと等価だと考えていたのだけど、よくよく考えてみると、前述のとおりそれは「1:1」の変換形式なので、複数の対象をひとつの場所(ディレクトリ)に移動したいという、mvコマンドのもう一つの目的を果たしたい場合のために作ったのがこれ。
これを使えば、たとえば以下のように指定した場合でも
apple.txt orange.md banana/ strawberry/
前半で指定した複数の対象(apple.txt, orange.md など)が、最後の「strawberry/」の中に収まる。
(実際には、ファイル名の一意を示す文字列を入力すればいいので、その例なら「ap or ba st」とすれば十分だが)
ちなみに、もし同じ指定を上記のrnameでやるとどうなるかと言うと、移動先として指定したつもりのファイル/ディレクトリ名をリネーム先の希望として解釈するので、「その名前のファイル/ディレクトリはすでにありますよ」と言って却下される。賢い。
DEMO: rmove
delete
最後にデリート機能。これは以前の記事で書いたものからほぼ変わっていない。
ちょっと気になるかな、と思うのは、削除したファイルの移動場所を、systemコマンドを使ってホームディレクトリ内に自動的に作ってしまうので(現状「tmp_trashbox」というもの)、嫌がる人はいるかも。
その場合、Macなら $HOME/.Trash がゴミ箱フォルダらしいので(おぼろげな記憶です)、 Delete.pm ファイル上部に設定している変数 $trashbox を適宜変更すればよいかと思う。
DEMO: delete
「rr」と指定すると、それに対応する果物が引っかかってくれる。
まとめ
まだまだ作っている最中なので、今後も細かく変更が入っていくと思うが、とりあえずの進捗報告的にまとめてみた。
deleteの移動先について、「気になる人がいるかも」などと書いたが、実際には他人が使っているところはあまり想定していなくて、しかし最初の方にも書いたとおり、自分ではけっこう使っていて、なかなか便利。