Files

將硬連結轉換為符號連結

  • July 14, 2018

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"

我創建了一個腳本來執行此操作。該腳本將它在源目錄(第一個參數)中找到的與工作目錄(可選的第二個參數)相同的所有硬連結轉換為符號連結:

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 個連結的文件。硬連結文件的連結計數至少為兩個。

引用自:https://unix.stackexchange.com/questions/171788