第一; 您是否有理由需要使用符号链接而不是通常的硬链接?我很难理解使用相对路径进行符号链接的必要性。这是我如何解决此问题的方法:
我认为fdupes的Debian(Ubuntu)版本可以使用该-L
选项用硬链接替换重复项,但是我没有安装Debian来验证这一点。
如果您没有带有该-L
选项的版本,则可以使用在commandlinefu上找到的这个小型bash脚本。
请注意,此语法仅适用于bash。
fdupes -r -1 path | while read line; do master=""; for file in ${line[*]}; do if [ "x${master}" == "x" ]; then master=$file; else ln -f "${master}" "${file}"; fi; done; done
上面的命令将在“路径”中找到所有重复的文件,并将其替换为硬链接。您可以通过运行ls -ilR
并查看inode编号来验证这一点。这是一个包含十个相同文件的样本:
$ ls -ilR
total 20
3094308 -rw------- 1 username group 5 Sep 14 17:21 file
3094311 -rw------- 1 username group 5 Sep 14 17:21 file2
3094312 -rw------- 1 username group 5 Sep 14 17:21 file3
3094313 -rw------- 1 username group 5 Sep 14 17:21 file4
3094314 -rw------- 1 username group 5 Sep 14 17:21 file5
3094315 drwx------ 1 username group 48 Sep 14 17:22 subdirectory
./subdirectory:
total 20
3094316 -rw------- 1 username group 5 Sep 14 17:22 file
3094332 -rw------- 1 username group 5 Sep 14 17:22 file2
3094345 -rw------- 1 username group 5 Sep 14 17:22 file3
3094346 -rw------- 1 username group 5 Sep 14 17:22 file4
3094347 -rw------- 1 username group 5 Sep 14 17:22 file5
所有文件都有单独的inode编号,从而使它们成为单独的文件。现在,让它们去重复:
$ fdupes -r -1 . | while read line; do j="0"; for file in ${line[*]}; do if [ "$j" == "0" ]; then j="1"; else ln -f ${line// .*/} $file; fi; done; done
$ ls -ilR
.:
total 20
3094308 -rw------- 10 username group 5 Sep 14 17:21 file
3094308 -rw------- 10 username group 5 Sep 14 17:21 file2
3094308 -rw------- 10 username group 5 Sep 14 17:21 file3
3094308 -rw------- 10 username group 5 Sep 14 17:21 file4
3094308 -rw------- 10 username group 5 Sep 14 17:21 file5
3094315 drwx------ 1 username group 48 Sep 14 17:24 subdirectory
./subdirectory:
total 20
3094308 -rw------- 10 username group 5 Sep 14 17:21 file
3094308 -rw------- 10 username group 5 Sep 14 17:21 file2
3094308 -rw------- 10 username group 5 Sep 14 17:21 file3
3094308 -rw------- 10 username group 5 Sep 14 17:21 file4
3094308 -rw------- 10 username group 5 Sep 14 17:21 file5
现在,文件都具有相同的索引节点号,这意味着它们都指向磁盘上的相同物理数据。
我希望这可以解决您的问题或至少为您指明正确的方向!
v1.51
(Ubuntu 14.04.2 LTS)中的选项。