web-dev-qa-db-ja.com

フォルダ内のすべてのハードリンクを見つける方法

同じファイルを持つ2つの外部ディスクがあります。 1つは暗号化され、もう1つは暗号化されません。暗号化されたものは、暗号化されていないものよりもはるかに少ないスペースが残っています。今は、暗号化されていないディスク上のハードリンクが原因であると思います。

そのため、暗号化されたディスクで二重化される可能性のあるハードリンクファイルがあるかどうかを確認したいと思います。ハードリンクを特定するにはどうすればよいですか?

空き領域の問題の理由が何か他にアイデアがある場合、私はアイデアを受け入れています。暗号化のためにファイルにさらにスペースが必要になる可能性はありますか?

2
Jeno
$ find -type f -links +1

これにより、複数のリンク(名前)を持つ通常のファイルがすべて表示されます。同じファイルにリンクされている名前はわかりません。そのため、-samefileまたは-inumを使用できます。 find -samefile "$somefile"

技術的な意味では、すべてのファイル(ファイル名)は(ハード)リンクであり、それらを指す複数のリンクを持つファイルはこの意味で興味深いものです。しかし、それらの場合でも、それらの1つが「適切な」ファイルであり、もう1つがリンクであると言う方法はありません。リンクは同等です。

例として:

$ touch a b c
$ ln b b2 ; ln c c2
$ find -type f -links +1
./c2
./b
./b2
./c
$ find -samefile b
./b
./b2
9
ilkkachu

ハードリンクを検索する

@ilkkachuと@barrycarterの答えは良いです。この回答は代替手段であり、いくつかの結果を詳細に説明します。

  • リンクされた{match is/matches are}が同じディレクトリツリーにある場合、それらは直接見つかります。

  • それ以外の場合は、マウントポイントからファイルシステム全体を検索できますが、同じファイルシステム内でのみ-xdevを使用できます。これは、ルートパーティションを検索する場合に重要です/他のマウントされたパーティションです。

    $ Sudo find / -xdev -type f -links +1 -ls | sort -n > hard-links-in-root.txt
    

以下は、現在のディレクトリで1つのハードリンクペアが見つかり、データパーティションのマウントポイント/media/multimed-2から検索することにより、2つのハードリンクの一致が別のディレクトリで見つかる例です。

$ Sudo find . -xdev -type f -links +1 -ls | sort -n
  5242881    648 -rw-rw-r--   2 olle     nio        657936 jun 30  2015 ./like-this.png
  5242882    940 -rw-rw-r--   2 olle     nio        957688 jun 30  2015 ./from-here.png
 14843905   1620 -rw-r--r--   2 olle     nio       1652803 jun 30  2015 ./img_4810.jpg
 14843905   1620 -rw-r--r--   2 olle     nio       1652803 jun 30  2015 ./mid-sommer-night_4810.jpg

$ find /media/multimed-2/ -samefile ./like-this.png
/media/multimed-2/Photos/2015/06/30/like-this.png
/media/multimed-2/Bilder/kartor/like-this.png

$ find /media/multimed-2/ -samefile ./from-here.png
/media/multimed-2/Photos/2015/06/30/from-here.png
/media/multimed-2/Bilder/kartor/from-here.png

異なる量のドライブ容量が使用されるその他の原因

  • さまざまなファイルシステム(ext4、NTFS、FAT32 ...)

  • パーティションサイズが異なるため、オーバーヘッド(メタデータ)に違いが生じます。

  • ドライブ上の異なるセクターサイズ(おそらく?)

5
sudodus

理論的には、ハードリンクは通常のファイルと見分けがつかないはずです(これがポイントです)。 「x」が「y」へのハードリンクである場合、「y」は「x」へのハードリンクでもあります。そうは言っても、ls -lの2列目は、特定のファイルへのリンクの数を示します。この数が1より大きい場合、ファイルはどこかにハードリンクがあるか、ハードリンクを持っています。これはディレクトリでは機能しない場合がありますが、その理由はわかりません。最初、ディレクトリ内の各ファイルにはそのディレクトリへのリンクがあると言っていましたが、間違っていました。「リンクカウント」が2だけの10個のファイルがあるディレクトリを見つけました。

ハードリンクが見つかったら、ls -iを実行してそのiノードを確認し、findのiノードオプションを使用して同じiノードを持つ他のファイルを見つけることができます(したがって、ハードリンクを作成します)お互い)。必ずfindを特定のデバイスに制限してください。そうしないと、誤った結果が得られる可能性があります。

すべてのハードリンクを一度に見つけるには、findがデバイス上のすべてのファイルのiノードを吐き出し、sortuniqなどを使用して重複を見つけます。

4
barrycarter

次のようなことができます:

find . -type t -ls | grep -v " 1 username"

これにより、現在のディレクトリ内のファイルがリストされ、lsが実行されます。 @barrycarterが言ったように、ハードリンクは実際のファイルと見分けがつきませんが、このリストでは複数のリンクを持っていると表示されます。 grep -vを使用して、リンクが1つしかないファイルを除外します。 (grepコマンドのusernameは、grepが単一の1の正しい場所を探すようにするためのものです。独自のユーザー名に置き換えてください。)

3
Jos