日々之迷歩

世の中わからんことだらけ

ITが複雑で難しくなっていく様に翻弄される日々です。微力ながら共著させていただいた「シェル・ワンライナー160本ノック」をよろしくお願い申し上げます。

続:inode番号が重複するファイルを表示

先日投稿していた、inode番号が重複するコマンドファイルを探し出すシェル芸ネタだが・・・

papiro.hatenablog.jp

たまたま眺めていた、第8回シェル芸勉強会のスライドを見ていたら、問題3の回答を見てあれれ?っと・・・(引用させていただきます)

www.slideshare.net

ファイルの中身が同じものを見つけだしているのだが、あれ?これってinode番号が重複するファイルを見つけることと、やってることはほぼ同じだぜ・・・キーがmd5チェックサムからinode番号に変わっただけだ。

ということで、レッツシェル芸!

awkの配列

最初よくわからんかったが、キー(この場合はinode番号)が同じ場合は、値(ファイル名)を空白区切りでケツに追加追加。

$ \ls -i /usr/bin | awk '{a[$1]=a[$1]" "$2}END{for(v in a){print a[v]}}'
 localedef
 parl parldyn
 edit_json.rb

inode番号が重複する場合は、横に2つ以上コマンドファイル名が並んでいる。あとはawkに投げ込んで、NFが1より大きい行のみ出力。完成。

$ \ls -i /usr/bin | awk '{a[$1]=a[$1]" "$2}END{for(v in a){print a[v]}}' | awk 'NF>1'
 parl parldyn
 compress uncompress
 egrep fgrep grep

Tukubai利用

まずはinode番号をキーにして並べ替え。

$ \ls -i /usr/bin | sort -k1,1 | head
 1723714 escputil
 1724489 cups-calibrate
 1744470 oauth

yarrコマンドってキーを指定出来たのか!(単に横に並べるとしか思ってなかった・・)

$ \ls -i /usr/bin | sort -k1,1 | yarr num=1
1723714 escputil
1724489 cups-calibrate
1744470 oauth
......
 8214662 touch
 8214826 less more
 8214831 bsdtar

あとはawkに投げ込んで、NFが2より大きい行のみ出力。完成。

$ \ls -i /usr/bin | sort -k1,1 | yarr num=1 | awk 'NF>2'
 8214826 less more
 8486486 egrep fgrep grep
 8541772 groups id whoami

うーんTukubaiコマンド、奥が深い・・・テキストデータを端末で活用するのに便利なのがいろいろあるな。