R. Ayanokouzi et al.

[linux] ハードリンクの移動

すでにハードリンクが含まれるディレクトリの中にハードリンクでない同じ内容を持つファイルが複数含まれる。この時、すべての同じ内容のファイルはハードリンク化されるかテスト

まずはテスト用の移動元ディレクトリとハードリンク化されるファイルを作成。

$ rm -fr ./mnt/sdb1/rdfind_test_dir
$ mkdir -p ./mnt/sdb1/rdfind_test_dir
$ for I in $(seq 0 1); do echo 1 > ./mnt/sdb1/rdfind_test_dir/rdfind_test_file${I}; done;

rdfind でファイルをハードリンク化し、結果を確認。これでテスト対象の作成完了。

$ rdfind -makehardlinks true ./mnt/sdb1/rdfind_test_dir
Now scanning "./mnt/sdb1/rdfind_test_dir", found 2 files.
Now have 2 files in total.
Removed 0 files due to nonunique device and inode.
Now removing files with zero size from list...removed 0 files
Total size is 4 bytes or 4 b
Now sorting on size:removed 0 files due to unique sizes from list.2 files left.
Now eliminating candidates based on first bytes:removed 0 files from list.2 files left.
Now eliminating candidates based on last bytes:removed 0 files from list.2 files left.
Now eliminating candidates based on md5 checksum:removed 0 files from list.2 files left.
It seems like you have 2 files that are not unique
Totally, 2 b can be reduced.
Now making results file results.txt
Now making hard links.
Making 1 links.
$ ls -li ./mnt/sdb1/rdfind_test_dir
total 8
56041475 -rw-r--r-- 2 **** **** 2 Feb 11 09:56 rdfind_test_file0
56041475 -rw-r--r-- 2 **** **** 2 Feb 11 09:56 rdfind_test_file1

ハードリンク化されたファイルを含むディレクトリを対象にmvすると以下。リンク同士の関係性は保たれているのでOK。

$ mv ./mnt/sdb1/rdfind_test_dir ./mnt/sdd1/
$ ls -li ./mnt/sdd1/rdfind_test_dir
total 8
169918466 -rw-r--r-- 2 **** **** 2 Feb 11 09:56 rdfind_test_file0
169918466 -rw-r--r-- 2 **** **** 2 Feb 11 09:56 rdfind_test_file1

ハードリンク化されたファイルをそれぞれ指定してmvすると以下。リンク同士の関係性は保たれているのでOK。

$ mkdir -p ./mnt/sde1/rdfind_test_dir
$ mv ./mnt/sdd1/rdfind_test_dir/rdfind_test_file* ./mnt/sde1/rdfind_test_dir/
$ ls -li ./mnt/sde1/rdfind_test_dir
total 8
111149058 -rw-r--r-- 2 **** **** 2 Feb 11 09:56 rdfind_test_file0
111149058 -rw-r--r-- 2 **** **** 2 Feb 11 09:56 rdfind_test_file1

ハードリンク化されたファイルの一つをmvで移動して、更にもう一つを別のインスタンスでmvすると、リンク同士の関係性がなくなるのでNG。

$ mkdir -p ./mnt/sdf1/rdfind_test_dir
$ mv ./mnt/sde1/rdfind_test_dir/rdfind_test_file0 ./mnt/sdf1/rdfind_test_dir
$ mv ./mnt/sde1/rdfind_test_dir/rdfind_test_file1 ./mnt/sdf1/rdfind_test_dir
$ ls -li ./mnt/sdf1/rdfind_test_dir
total 8
106168322 -rw-r--r-- 1 **** **** 2 Feb 11 09:56 rdfind_test_file0
106168323 -rw-r--r-- 1 **** **** 2 Feb 11 09:56 rdfind_test_file1

同じinodeを持つファイルを同じ移動先に移動する場合はいいけど、同じinodeを持つファイルを移動前に検索しておく必要があるし、ファイルごとに移動先を変えたい場合は要注意だなぁ。

リファレンス

  1. Does mv Preserve Hard Links?

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2008-04-24T09:48:31+09:00
  2. Modified: 2008-04-24T09:48:31+09:00
  3. Generated: 2021-03-31T07:51:28+09:00