Linux

使用 cp 將軟連結轉換為硬連結

  • October 10, 2013

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是一個符號連結(軟連結),它不指向與以下相同的 inode a

$ ls -i1c a b
16647344 a
16647362 b
  • cp -aH a b c;:複製文件ab進入目錄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如果目標目錄相同,就足以將符號連結轉換為硬連結。

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