将硬链接转换为符号链接

将硬链接转换为符号链接

可以很容易地将符号链接转换为硬链接ln -f例子

如果您知道这两个文件并自己定义哪个是“原始文件”,那么将硬链接(文件名linkoriginal)转换回符号链接也很容易。link->original您可以轻松创建一个简单的脚本convert-known-hardlink-to-symlink,其结果如下:

convert-known-hardlink-to-symlink link original
$ ls -li
3802465 lrwxrwxrwx 1 14 Dec  6 09:52 link -> original
3802269 -rw-rw-r-- 1  0 Dec  6 09:52 original

但如果你有一个可以定义的脚本,那将会非常有用一个工作目录(默认./)和一个搜索目录 搜索位置(默认/)对于具有相同 inode 的文件,然后将所有这些硬链接转换为符号链接。

结果是,在定义的工作目录中,所有硬链接文件都被替换为具有相同 inode 的第一个找到的文件的符号链接。


一个开始是find . -type f -links +1 -printf "%i: %p (%n)\n"

答案1

我创建了一个脚本来执行此操作。该脚本将其在源目录(第一个参数)中找到的与工作目录(可选的第二个参数)中相同的所有硬链接转换为符号链接:

https://gist.github.com/rubo77/7a9a83695a28412abbcd

它有一个用于试运行的选项 -n,该选项不执行任何操作,但显示将要执行的操作。

主要部分:

$WORKING_DIR=./
#relative source directory from working directory:
$SOURCE_DIR=../otherdir/with/hard-links/with-the-same-inodes

# find all files in WORKING_DIR
cd "$WORKING_DIR"
find "." -type f -links +1 -printf "%i %p\n" | \
  while read working_inode working_on
do
    find "$SOURCE_DIR" -type f -links +1 -printf "%i %p\n" | sort -nk1 | \
      while read inode file
    do
        if [[ $inode == $working_inode ]]; then
            ln -vsf "$file" "$working_on"
        fi
    done
done

-links +1 --> 将查找具有超过 1 个链接的所有文件。硬链接文件的链接数至少为两个。

答案2

至少还GNU find可以让您通过 Inode 进行搜索,可以是数字 ( -inode) 也可以通过指定链接 ( -samefile) 进行搜索。

所以你可以使用:

find "$WORKING_DIR" -type f -links +1 | while read file
do
  find "$SOURCE_DIR" -samefile "$file" -exec ln -vsf '{}' "$file" \;
done

您只需确保使用单独的目录即可。另一方面,ln如果您尝试将文件链接到其自身,则会抱怨。

另外,您应该提供 的绝对路径$SOURCE_DIR,或者使用-r选项来ln创建相对链接,否则链接可能会损坏。

相关内容