web-dev-qa-db-ja.com

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

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

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

23
haimg

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

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

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

または@mbaffordバージョン:

find / -type f -links +1 -printf '%i %n %p\n'
20
Gilles Quenot
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に印刷のiノード番号を呼び出しさせ、次にfind-inumこのiノードに関連付けられているすべてのファイルを表示するオプション。

16
Claudius

私見の最善の方法は、次の行を使用することです(/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回だけスキャンし、inode、ハードリンクの数、および複数のハードリンクを持つファイルのパスを表示し、inodeに従ってそれらをソートします。

読み取りが許可されていないフォルダーのエラーメッセージに悩まされている場合は、この行を次のように拡張できます。

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
1
DJCrashdummy