Files
將硬連結轉換為符號連結
ln -f
使用(範例)將符號連結轉換為硬連結很容易如果您知道兩個文件並定義自己哪個是“原始文件”,那麼將硬連結(文件名
link
和original
)轉換回符號連結也很容易。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 個連結的文件。硬連結文件的連結計數至少為兩個。