質問: lsによる実際のハードリンクはどうやって見ることができますか? 走るln /a/a /b/b ファイルaがaで指しているフォルダlsを見てみたい。
回答: ファイルシステム内のすべてのハードリンクを見つけるためのスクリプトに関する回答はたくさんあります。それらのほとんどは、ファイルシステム全体を-samefileでスキャンしてeach多重リンクファイルを探すようなばかげたことをします。狂ってる;必要なのは、iノード番号をソートして重複を印刷することだけです。find directories.. -xdev ! -type d -links +1 -printf '%20d %20i %p\n' | sort -n | uniq -w 42 --all-repeated=separate(私のオリジナルのコマンドを微調整して、fs-id(%d)をサポートし、通常のファイルだけでなくすべてのディレクトリではないファイルタイプを処理できるようにしてくれた。@tinoに感謝します。)! -type d -links +1を使うことは、sortの入力がuniqの最終出力と同じくらい大きいことを意味します。ハードリンクのセットの1つだけを含むサブディレクトリでそれを実行しない限り。とにかく、これは他の投稿されたソリューションよりもファイルシステムを再トラバースするlotより少ないcpu時間を使うでしょう。出力例:... 2429 76732484 /home/peter/weird-filenames/test/.hiddendir/foo bar 2429 76732484 /home/peter/weird-filenames/test.orig/.hiddendir/foo bar 2430 17961006 /usr/bin/pkg-config.real 2430 17961006 /usr/bin/x86_64-pc-linux-gnu-pkg-config 2430 36646920 /usr/lib/i386-linux-gnu/dri/i915_dri.so 2430 36646920 /usr/lib/i386-linux-gnu/dri/i965_dri.so 2430 36646920 /usr/lib/i386-linux-gnu/dri/nouveau_vieux_dri.so 2430 36646920 /usr/lib/i386-linux-gnu/dri/r200_dri.so 2430 36646920 /usr/lib/i386-linux-gnu/dri/radeon_dri.so ... todo?:出力をアンパッドします。 uniqは非常に限られたフィールド選択のサポートを持っているので、私はfind出力を埋め込み、固定幅を使います。 20文字は、可能な最大iノード番号またはデバイス番号(2 ^ 64-1 = 18446744073709551615)に十分な幅です。 xfsは、ディスク上の割り当て位置に基づいて、0から連続していないiノード番号を選択するため、大規模なxfsファイルシステムでは、数十億のファイルがなくても32ビットを超えるiノード番号を使用できます。他のファイルシステムは、たとえ巨大でなくても、20桁のiノード番号を持つことがあります。todo:パスごとに重複グループをソートします。マウントポイントでソートしてから、inode番号を使うと、ハードリンクがたくさんあるサブディレクトリがいくつかある場合は、混在させることができます。 (すなわち、重複グループのグループは一緒になるが、出力はそれらを混同する)。最後のsort -k 3は、行のグループを単一のレコードとしてではなく、行を個別にソートします。改行のペアをnulバイトに変換するための何かを前処理し、gnu sort --zero-terminated -k 3を使用することでうまくいく可能性があります。ただし、trは1文字のみで動作し、2 - > 1または1 - > 2パターンではありません。 perlはそれをするでしょう(あるいは単にperlやawkの中でパースしソートするでしょう)。 sedも動作するかもしれません。