Linux 學習筆記 cp 和 ln

2022-03-26 17:34:31 字數 2984 閱讀 9640

最近在重溫大學的經典課程:linux。每天工作之餘的時間,坐在家裡的陽台上,簡簡單單的紀錄一些基本的知識點,對我來說,既溫暖又難得。

有朋友問我關於cp和ln建立符號鏈結(軟鏈結)和硬鏈結的一些問題,在這裡做個記錄。

cp 命令

基本用法:

cp source destination

該命令將source複製至乙個新檔案,叫destination。注意,這種複製,是真實將原始檔內容拷貝了乙份,存在了物理儲存空間。

我們使用命令ls -il來顯示檔案的長列表,會發現destination與source有不同的索引節點號(索引節點是核心分配給檔案系統中每個物件的唯一標識數字)。

root@iz28eyzqmtxz:~# ls

jdk log.txt

root@iz28eyzqmtxz:~# cp

log.txt log2.txt

root@iz28eyzqmtxz:~# ls -il

total

4786442 drwxr-xr-x 2 root root 4096 jun 6

22:33

jdk787736 -rw-r--r-- 1 root root 0 jul 2

11:36

log2.txt

787737 -rw-r--r-- 1 root root 0 jun 14

17:29

log.txt

root@iz28eyzqmtxz:~#

cp命令有很多引數,可以進行諸如遞迴複製整個目錄中的所有內容等。相關引數可以參看linux程式設計大全。

這裡要解釋的是-l和-s兩個引數。

雖然沒有看過linux的原始碼,但是可以推斷出這邊用到了c中的兩個特性:指標,指標的指標。

我們知道作業系統在進行儲存管理的時候,會為檔案儲存的物理空間的起點標識乙個確定的「位址」,而我們所見的檔名,其實在儲存空間中,儲存的是真實原始檔的「位址」,這個位址指向了原始檔的真實儲存空間。

如上圖,儲存空間a和儲存空間b可能是相鄰的儲存空間,也可能不是,但它們一定是兩個儲存空間存了相同的內容。

也就是說我們如果執行的是 cp -l log.txt log2.txt,實際上並沒有建立乙份新的原始檔,只是對儲存空間a新加了乙個指向它的指標。

root@iz28eyzqmtxz:~# ls

jdk log2.txt log.txt

root@iz28eyzqmtxz:~# ls -il

total

4786442 drwxr-xr-x 2 root root 4096 jun 6

22:33

jdk787736 -rw-r--r-- 1 root root 0 jul 2

11:36

log2.txt

787737 -rw-r--r-- 1 root root 0 jun 14

17:29

log.txt

root@iz28eyzqmtxz:~# cp -l log.txt log3.txt

root@iz28eyzqmtxz:~# ls -il

total

4786442 drwxr-xr-x 2 root root 4096 jun 6

22:33

jdk787736 -rw-r--r-- 1 root root 0 jul 2

11:36

log2.txt

787737 -rw-r--r-- 2 root root 0 jun 14

17:29

log3.txt

787737 -rw-r--r-- 2 root root 0 jun 14

17:29

log.txt

root@iz28eyzqmtxz:~#

這樣一來,無論我們是查詢log.txt還是log3.txt,都會先找到它們代表的0xa300的儲存空間,接著便能找到並操作原始檔。

我們在這邊可以先解釋乙個已經可以解釋的問題:既然log.txt和log3.txt指向同乙個原始檔,為什麼刪除log3.txt之後,仍然可以訪問log.txt?

也就是說,對於儲存空間a來說,你刪除了log3.txt之後,只是斷掉了乙個指向它的指標而已,並沒有執行刪除原始檔的操作。

自此,我們講完了硬鏈結,其實就是乙個指標的概念,硬鏈結的指標,是指向真實檔案的指標,而接下來要講的軟鏈結,也是乙個指標,只不過這個指標指向的是乙個位址,該位址也是乙個指標,指向真實檔案。所以軟鏈結(符號鏈結),即指標的指標。

cp -s log.txt log4.txt之後真實的儲存情況長這樣。

訪問log4.txt時先找到了它代表的0xa000,找到了0xa000儲存空間中儲存的內容:0xa300,發現它丫的還是乙個指標,接著找,找到了儲存真實檔案的儲存空間a。

這裡我們可以解釋另乙個現象,就是為什麼刪除了log.txt之後,無法訪問log4.txt?

這個你自己想吧,中間斷掉了,它訪問0xa000,嗯,發現裡面啥都沒有!接著就會告訴你它已經不復存在了,然而你使用ls命令的時候,仍然能看到log4.txt這個檔名,只是無法檢視它的內容了。

忠告:不要覺得軟鏈結和硬鏈結如此牛逼,就一頓亂用,人家是有使用場合的,比如硬鏈結,是你在同種**介質上不想為相同的內容耗費兩份儲存空間的時候使用的,而軟鏈結是你想在不同掛載點上使用該檔案的時候使用的(即不能在不同掛載點下的檔案間建立硬鏈結)。

如果你乙個勁的使用軟鏈結,就會各種斷,各種崩。

ln命令

ln命令可以代替cp命令,預設情況下,ln命令會建立硬鏈結,要加上引數 -s以建立軟鏈結。

Linux學習筆記 cp複製命令

語法 和mv類似 cp option t source dest cp option source directory cp option t directory source description copy source to dest,or multiple source s to direc...

Linux學習筆記 5 鏈結命令ln

把原檔案生成乙個鏈結的目標檔案,分為軟連線和硬鏈結。具有相同的i節點和儲存block塊。當使用者去搜尋乙個檔案時,會先去查檔案索引表,找到儲存位置,然後再去硬碟裡這些位置的block塊拿出資料塊返回給使用者。硬鏈結的檔案具有相同的i節點號,那麼在檔案索引表中找到的就是同一行,記錄的儲存位置也必然是一...

Linux學習筆記11 cp命令

功能說明 複製檔案或目錄。語 法 cp abdfilpprrsuvx s 備份字尾字串 v 備份方式 help spares 使用時機 version 原始檔或目錄 目標檔案或目錄 目的目錄 補充說明 cp指令用在複製檔案或目錄,如同時指定兩個以上的檔案或目錄,且最後的目的地是乙個已經存在的目錄,則...