続:inode番号が重複するファイルを表示
先日投稿していた、inode番号が重複するコマンドファイルを探し出すシェル芸ネタだが・・・
たまたま眺めていた、第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コマンド、奥が深い・・・テキストデータを端末で活用するのに便利なのがいろいろあるな。