回答:
次のコマンドを実行できます。
find / -type f -printf '%n %p\n' | awk '$1 > 1{$1="";print}'
すべてのハードリンクファイルを検索します。
または@mbaffordバージョン:
find / -type f -links +1 -printf '%i %n %p\n'
find / -type f -links +1 -printf '%i %n %p\n'
sort
(+ uniq
)はどうですか?私は興味があったので、メインコンピューター(ssdで16GB i5-2500k)を試してみました。2187757個のファイル(find / -xdev -type f | wc
)は、3820個のファイル/ 570個のiノード(time sudo find / -xdev -type f -links +1 -printf "%i\n" | sort | uniq | wc
)を返すのに12リアル秒かかります。%n %p
iノードをカウントするために実際のファイルを取り出したので、実際のファイルに含める必要があります。
find . -type f -links +1 2>/dev/null
複数のリンクを持つすべてのファイル、つまりハードリンクが存在するファイルのリストを提供します。これをループするのは比較的簡単です。多くのファイルがなければ、ハッキングの解決策になります
for i in $(find . -type f -links +1 2>/dev/null); do find -samefile $i | awk '{printf "%s ", $1}'; printf "\n"; done | sort | uniq
しかし、私は心からまずせることにより、例えば、よりよい解決策があることを願っていますfind
使用して、呼び出し印刷inode番号をとfind
の-inum
、このiノードに関連付けられているすべてのファイルを表示するオプションを選択します。
find . -type f -printf '%i %p\n'
を使用すると、はるかに高速なソリューションを構築できます。
for
ループ、調整IFSはそれに応じて動作します。コメント内のfindコマンドの出力を解析するには、最初のスペースから行末までのすべてをファイル名として宣言することも有効です。
lost+found
など)。2行目のように出力をさらに処理する必要がある場合、これは特に重要です。
私見の最良の方法は、次の行を使用することです(確かに/PATH/FOR/SEARCH/
、検索したいものに置き換える必要があります)。
find /PATH/FOR/SEARCH/ -xdev -printf '%i\t%n\t%p\n' | fgrep -f <(find . -xdev -printf '%i\n' | sort -n | uniq -d) | sort -n
これは、ファイルシステムを1回だけスキャンし、iノード、ハードリンクの数、および複数のハードリンクを持つファイルのパスを表示し、iノードに従ってソートします。
読み取りが許可されていないフォルダーのエラーメッセージに悩まされている場合は、次の行を展開できます。
find /PATH/FOR/SEARCH/ -xdev -printf '%i\t%n\t%p\n' 2> /dev/null | fgrep -f <(find . -xdev -printf '%i\n' 2> /dev/null | sort -n | uniq -d) | sort -n