ファイルシステム上のすべてのハードリンクされたファイルを見つけるにはどうすればよいですか?


21

特定のファイルシステムですべてのハードリンクファイルを見つける必要があります。たとえば、ファイルのリストを取得します。各行には、リンクされたペアまたはトリプレットなどが含まれます。

私は多かれ少なかれそれを行う方法を理解しています。ファイルシステム上のすべてのファイル/ディレクトリに対して、iノードをキーとする辞書を作成する必要があります。そして「..」リンク、そして複数の名前を持つindodesはハードリンクです...しかし、多分既製のソリューションが存在するか、誰かがすでにそのようなスクリプトを書いていることを願っています。

回答:


17

次のコマンドを実行できます。

find / -type f -printf '%n %p\n' | awk '$1 > 1{$1="";print}'

すべてのハードリンクファイルを検索します。

または@mbaffordバージョン:

find / -type f -links +1 -printf '%i %n %p\n'

1
おかげで、これはまさに私が望んでいたものではなく、十分に近いものです。私は...それによって、iノード番号、その後、ソート/グループを印刷するには「私は%」を追加することができます
haimg

15
あなたは、検索の「-links + n」の構文を使用して、awkのための必要性を回避することができます例えば、少なくとも二つのリンクを持つすべてのファイルを検索し、必要な情報をプリントアウトする:find / -type f -links +1 -printf '%i %n %p\n'
mbafford

パイピング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 %piノードをカウントするために実際のファイルを取り出したので、実際のファイルに含める必要があります。
北ブラッドリー

17
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ノードに関連付けられているすべてのファイルを表示するオプションを選択します。


1
痛い!これにより、各ハードリンクファイルについてファイルシステムが何度もスキャンされます
...-haimg

1
私はそれが高速だと主張しませんでした–そしてそれは小さなディレクトリツリーのための一種の仕事です。もちろん、たとえばの出力から構築できる適切なインデックスfind . -type f -printf '%i %p\n'を使用すると、はるかに高速なソリューションを構築できます。
クラウディウス

そして、それはパスAFAIKのスペースを処理しません。
ジルケノ

forループ、調整IFSはそれに応じて動作します。コメント内のfindコマンドの出力を解析するには、最初のスペースから行末までのすべてをファイル名として宣言することも有効です。
クラウディウス

1
@Sati:エラーメッセージが破棄されることを保証します(たとえば、あなたがアクセスしたくないフォルダlost+foundなど)。2行目のように出力をさらに処理する必要がある場合、これは特に重要です。
DJCrashdummy

1

私見の最良の方法は、次の行を使用することです(確かに/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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.