web-dev-qa-db-ja.com

デスクトップPC上のハードリンクされたファイルの落とし穴は何ですか?

これで、PC上のすべての同一コンテンツファイルがハードリンクされました。 (私のデータは完全に重複排除されています。これは、古いコンピューターからデータをコピーした方法の結果です。)

1つのファイルに対する特定のアクションが他の多くのファイルにサイレントに影響を与える可能性があるため、どのような落とし穴に注意する必要がありますか?

作業中のファイルを削除しても問題がないことはわかっています(意図的に削除したと仮定します)。他のハードリンクされたファイルには影響せず、削除アクションによって予期しない副作用が発生することはありません。

ファイルの移動や名前の変更は問題ではありません。予期しない結果は見られません。

ハードリンクされたファイルのコピーは問題ではないと思いますが、この点で予期しない結果が生じることについては自信がありません。私が見たのは、cpを使用してハードリンクされたファイルのコピーを(同じディスクに)作成すると、コピーがハードリンクされたままになることです(つまり、iノード番号はコピー内で変更されません)。別のファイルシステムにコピーすると、明らかにハードリンクが壊れます。 (私のPCに3台のハードディスクがあることを考えると、1つの落とし穴がこの事実を忘れていると思います。)

権限を変更すると、リンクされているすべてのファイルに影響します。これまでのところ、これは便利であることが証明されています。 (ハードリンクされたファイルを多数読み取り専用にしました。)

上記の操作のいずれも、予期しない大きな結果をもたらすようには見えません。

ただし、Daniel Beckがコメントで指摘したように、ファイルの編集や変更が問題になる場合があります。それはツールと多分編集のタイプに依存します。 (たとえば、sedを使用して小さなテキストファイルを編集すると、nanoを使用すると常にリンクが切断されるようです。)これにより、1つのファイルを編集するとallに影響する可能性があります。 )ハードリンクされたファイル(つまり、元のiノードを変更します)。

私の提案した解決策これに対するすべてのハードリンクされたファイルを読み取り専用にすることです(そしてそれはすでにほとんどの場合です)。一部のファイルでそれができない場合は、それらの特定のファイルのリンクを解除します。この読み取り専用のアプローチに問題はありますか?

ファイルを編集して読み取り専用であることがわかった場合は、書き込み可能にするときにそのファイル名のリンクを解除することを忘れないでください。したがって、1つの落とし穴がこのルールを忘れている可能性があります。その場合、バックアップに頼る必要があります。

上記の記述は正しいですか?そして、他に何を知る必要がありますか?

ところで、私はKubuntu12.04を実行しています。私もbtrfsを使用しています。 (PCに2つのSSDと1つのHDDがあります。外付けUSB HDDも追加します。また、ネットワークに接続し、いくつかのNFS共有をマウントします。これらの最後のビットのいずれもに関連するとは思いません。質問ですが、念のため追加します。)

ところで、私は複数のドライブ(別々のファイルシステムを使用)を持っているので、ファイルのリンクを解除するには、ファイルを別のドライブにコピーしてから元に戻すだけです。ただし、sedの使用も機能します(私のテストでは)。これが私のスクリプトです:

sed -i 's/\(.\)/\1/' file1

驚いたことに、これはゼロバイトのファイルのリンクを解除することさえあります。私のテストでは、特別なオプションがなくてもテキスト以外のファイルでも機能するようです。 (しかし、私は--binaryオプションは、Windows、MS-DOS、およびCygwinで必要になる場合があります。)ただし、別のディスクにコピーして戻ることが、リンクを解除するための最良の方法である場合があります。私のユースケースでは、unlinkコマンドは実際には「リンク解除」せず、「削除」します。

5
MountainX

これが私がこれまでに考えた落とし穴です:

1。ファイルyを編集するときに、1つ以上のファイルxの内容を意図せずに変更する可能性があります。

私の元の質問で述べたように、これの回避策は、すべてのハードリンクされたファイルをデフォルトで読み取り専用にすることです。頻繁に編集されるファイルの場合、おそらく適切ではないため、ハードリンクは使用しません。

重要な更新:これが本当の落とし穴です。読み取り専用であっても、編集者がファイルをサイレントに上書きする場合があります。たとえば、パーミッションが400で、rootが所有する空のファイルがありました。ファイルをnanoで開き、編集して保存しました。 nanoは、読み取り専用であると文句を言いませんでした。すべてのハードリンクされたfilnameの内容が間違っていました。残念ながら、ファイルを読み取り専用にすることは、私が期待した回避策ではありません。これは確かに重大な落とし穴です。

2。ファイルの新しいコピーを意図せずに作成する可能性があります。これは本質的に最初の落とし穴の反対です。単一のファイルcontentにはN個のファイル名を含めることができます。これらのファイル名の1つを編集すると、contentの2つの異なる項目が作成され、N(ファイル名の数)はまったく変更されない場合があります。これが起こったという事実に気付かない可能性があります(ハードリンクに注意を払わない場合)。

私の場合のこれの実例は、私のまとまりのない写真コレクションです。現在、同じ写真を異なる名前で異なるディレクトリに保存しています(たとえば、写真を整理する時間をとらずにカメラから複数回ダウンロードしたため)。ハードリンクとは、このために多くのスペースを無駄にしないことを意味します。これらのファイルの1つを編集すると、ハードリンクされたすべてのファイル名に常に影響することをお勧めします(編集した写真を新しい名前で特別に保存しない限り)。ただし、これはおそらく当てはまりません。したがって、落とし穴は、写真を編集すると、私の写真コレクションがさらに混乱する可能性があるということです。同じ落とし穴が音楽やビデオ(または仮想マシンの画像など)にも当てはまる可能性があります。

同じ回避策が私が思いついた唯一の回避策です-ファイルを読み取り専用にするので、ハードリンクに注意を払う必要があることを編集する必要があることを思い出します。 (すべてのファイル名をすばやく再リンクする方法など、より良い回避策はありますか?)

私の写真コレクションがハードリンクされていることのもう1つの(肯定的な)結果は、今でははるかに迅速に整理できることです。たとえば、このコマンドを使用すると、重複するすべての写真を見つけることができます。

find 2>/dev/null /home/me/Pictures -type f -links +1 -printf "%n\t%i\t%d\t%s\t%t\t%p\n" | sort -gr > /home/me/Pictures/duplicatesList.txt

そのリストを使用して、保持したくないファイル名を自信を持って削除できます。最終的には、ハードリンクされた写真がなくなる可能性があります。

3つ目の落とし穴は考えられません。誰かが2つ以上の落とし穴を持っているなら、答えてください、そして私はあなたの答えを受け入れます(それが私のものより良いと仮定して)。

全体として、すべてのハードリンクファイルを読み取り専用にした場合、ハードリンクによって日常のコンピューティングタスクがそれほど複雑になるとは思いません。これは、次のようなコマンドで簡単に実行できます。

find . -type f -links +1 -perm /g+w,o+w -iname *.gif -exec chmod 444 '{}' \;

必要に応じてパスやファイル拡張子を変更できます。 Linuxのデフォルトインストールで使用されるハードリンクに触れる予定はありません。私は個人データのハードリンクのみを扱っています。 1つのコマンドで、ハードリンクされたすべてのファイルを読み取り専用に変更するだけで済みます。

時間の経過とともに、不要なファイル名を取り除き、データ(および私の生活)を簡素化します。ファイルが本当に読み取り専用であり、重複が保証されている場合は、それらのファイルのハードリンクを無期限に残します。

ただし、場合によっては、ファイルのリンクを解除し、意図的に独立した重複ファイルを残します。この最後のケースは、ソースコードツリーで非常に一般的に発生します。同じファイルの内容が複数の場所で正当化され、書き込み可能である必要があります。読み取り専用のソースコードファイルに遭遇し、それを編集する必要がある場合は、リンクを解除します。通常、ファイルを編集するだけでリンクが解除されます。しかし、私が知っているこのコマンドを使用することで、ファイルのリンクを解除することができます。

sed -i 's/\(.\)/\1/' file1

例:

上記の落とし穴#1の例を次に示します。これは、私が出会ったばかりのファイルシステムの実際の例です。

「index.original.html」というファイルを見て、安全に編集できると思ったので、「index.htmlのコピー」を破壊的に編集しようと思いました。ただし、ファイルがハードリンクされていることが判明したため、「コピー」を編集すると元のファイルも変更されます。

ファイルがハードリンクされたことを示す情報は次のとおりです。

2   45214   6   6641    Thu Oct 30 10:46:00.0000000000 2008 /Site/FusionAppsVPS/index.original.html
2   45214   6   6641    Thu Oct 30 10:46:00.0000000000 2008 /Site/FusionAppsVPS/Copy of index.html
2
MountainX

落とし穴はファイルの上書きです。

一部のアプリケーションは、ファイルを削除して、元の名前で新しいファイルを書き込もうとします。この場合、ファイル名は分離されます。他のアプリケーションは、書き込みのためにファイルを直接開こうとします。この場合、他の名前の内容も変更されます。ただし、すべての重複リンクファイルをr/oにすると、これは簡単に区別できます。

1
Michael Tsang