Linux
使用 cp 將軟連結轉換為硬連結
該
cp
命令的info
頁面提供--preserve=
以下選項:
links
在目標文件中保留相應源文件之間的任何連結。請注意,使用
-L' or
-H’,此選項可以將符號連結轉換為硬連結。接下來是一個我不明白的例子
$$ now $$; 無論如何: 問題:如何將軟連結變成硬連結
cp
?還有回去的路嗎$$ converting hard- into softlinks $$?
次要問題:上面引用中的**可以在哪裡發揮作用?**我了解 and 的目的
-L
,-H
我能夠複製功能齊全的軟連結等,但到目前為止我還沒有設法將軟連結變成硬連結。
資訊頁面中的範例向您展示了該範例如何有點難以理解:
$ mkdir c; : > a; ln -s a b; cp -aH a b c; ls -i1 c 74161745 a 74161745 b
讓我們把它分解成它的組件命令:
mkdir c;
: 創建目錄c/
: > a;
: 只是一種創建空文件的快速方法。它相當於echo "" > a
。:
是一個內置的 bash,它什麼都不做,請參閱help :
.ln -s a b
: 創建一個指向a
被呼叫的軟連結b
。此時,這些是目前目錄的內容:$ ls -l | cc2ter total 4 -rw-r--r-- 1 terdon terdon 0 Oct 9 02:50 a lrwxrwxrwx 1 terdon terdon 1 Oct 9 02:50 b -> a drwxr-xr-x 2 terdon terdon 4096 Oct 9 02:50 c
請注意,這
b
是一個符號連結(軟連結),它不指向與以下相同的 inodea
:$ ls -i1c a b 16647344 a 16647362 b
cp -aH a b c;
:複製文件a
並b
進入目錄c
。這是發生轉換的地方,傳遞給的選項cp
是:-a, --archive same as -dR --preserve=all -d same as --no-dereference --preserve=links -H follow command-line symbolic links in SOURCE
-H
是必要的,因為(來自info cp
):從符號連結複製時,“cp”通常僅在不遞歸複製時才跟隨連結。
由於
-a
啟動遞歸複製 (-R
),-H
因此需要遵循符號連結。-H
意味著儘管遞歸仍會遵循連結,並將導致在目標目錄中建立硬連結。這些是c/
最後一步之後的內容(第一列是inode號):$ ls -li c total 0 17044704 -rw-r--r-- 2 terdon terdon 0 Oct 9 02:50 a 17044704 -rw-r--r-- 2 terdon terdon 0 Oct 9 02:50 b
現在關於它的工作原理,據我所知,如果連結和目標都被複製到同一個目錄
cp --preserve=links
,則結合-L
或-H
將符號連結轉換為硬連結。事實上,正如 OP發現的那樣,至少在 Debian 系統上,
cp --preserve=links
如果目標目錄相同,就足以將符號連結轉換為硬連結。