mattak's blog

気の向くままに書く

cdiffでファイルパスの差分をみよう。

cdiff

linuxのshellでいろいろ操作してると、かゆいところに手が届かないことがよくある。 たとえば、androidの画像ファイルをもらったときに以下のようにしたい場合がある。

$ ls
icon_36x36.png
icon_48x48.png
icon_72x72.png
icon_96x96.png

これをなんとか

$ find . -type f
./drawable-ldpi/ic_launcher.png
./drawable-mdpi/ic_launcher.png
./drawable-hdpi/ic_launcher.png
./drawable-xhdpi/ic_launcher.png

に直したい。 そこでcdiffの出番.

$ ls | cdiff 
icon_{36x36,48x48,72x72,96x96}.png

cdiffは標準入力から受け取った文字列集合の共通部分と差異の部分を切り分けてくれる.

$ ls | cdiff {d0}
36x36
48x48
72x72
96x96

こんな感じでね。 {d0}というのはdifferenceの0番目という意味。 差異部分のはじめの箇所を取ってくれる。 同様に、{c0}とうつと

$ ls | cdiff {c0}
icon_
icon_
icon_
icon_

のように、共通部分を抽出してくれる。

さっきのic_launcher.pngに直す問題は以下の感じ。

$ ls | cdiff {d0} | xargs -n 1 -I{} mkdir {}
$ find . -type f | cdiff mv {} {d0}/ic_launcher.png | sh
mv ./icon_36x36.png 36x36/ic_launcher.png
mv ./icon_48x48.png 48x48/ic_launcher.png
mv ./icon_72x72.png 72x72/ic_launcher.png
mv ./icon_96x96.png 96x96/ic_launcher.png

これで、36x36 -> drawable-ldpi, 48x48 -> drawable-mdpi, 72x72 -> drawble-hdpi, 96x96 -> drawable-xhdpi に直してあげればいい。

$ dpidir .

ここの部分は、小さい順にディレクトリ名をマッピングする処理になるので、面倒だから専用コマンドを書いた。

とりあえず上記のような感じで、わたってきたファイルパスなどの差分文字をつかって何か処理を行うときに、cdiffは結構便利です。

enjoy!