同じファイルを持つ2つの外部ディスクがあります。 1つは暗号化され、もう1つは暗号化されません。暗号化されたものは、暗号化されていないものよりもはるかに少ないスペースが残っています。今は、暗号化されていないディスク上のハードリンクが原因であると思います。
そのため、暗号化されたディスクで二重化される可能性のあるハードリンクファイルがあるかどうかを確認したいと思います。ハードリンクを特定するにはどうすればよいですか?
空き領域の問題の理由が何か他にアイデアがある場合、私はアイデアを受け入れています。暗号化のためにファイルにさらにスペースが必要になる可能性はありますか?
$ 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
@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 ...)
パーティションサイズが異なるため、オーバーヘッド(メタデータ)に違いが生じます。
ドライブ上の異なるセクターサイズ(おそらく?)
理論的には、ハードリンクは通常のファイルと見分けがつかないはずです(これがポイントです)。 「x」が「y」へのハードリンクである場合、「y」は「x」へのハードリンクでもあります。そうは言っても、ls -l
の2列目は、特定のファイルへのリンクの数を示します。この数が1より大きい場合、ファイルはどこかにハードリンクがあるか、ハードリンクを持っています。これはディレクトリでは機能しない場合がありますが、その理由はわかりません。最初、ディレクトリ内の各ファイルにはそのディレクトリへのリンクがあると言っていましたが、間違っていました。「リンクカウント」が2だけの10個のファイルがあるディレクトリを見つけました。
ハードリンクが見つかったら、ls -i
を実行してそのiノードを確認し、find
のiノードオプションを使用して同じiノードを持つ他のファイルを見つけることができます(したがって、ハードリンクを作成します)お互い)。必ずfind
を特定のデバイスに制限してください。そうしないと、誤った結果が得られる可能性があります。
すべてのハードリンクを一度に見つけるには、find
がデバイス上のすべてのファイルのiノードを吐き出し、sort
やuniq
などを使用して重複を見つけます。
次のようなことができます:
find . -type t -ls | grep -v " 1 username"
これにより、現在のディレクトリ内のファイルがリストされ、ls
が実行されます。 @barrycarterが言ったように、ハードリンクは実際のファイルと見分けがつきませんが、このリストでは複数のリンクを持っていると表示されます。 grep -v
を使用して、リンクが1つしかないファイルを除外します。 (grepコマンドのusername
は、grepが単一の1
の正しい場所を探すようにするためのものです。独自のユーザー名に置き換えてください。)