最近在重溫大學的經典課程:linux。每天工作之餘的時間,坐在家裡的陽台上,簡簡單單的紀錄一些基本的知識點,對我來說,既溫暖又難得。
有朋友問我關於cp和ln建立符號鏈結(軟鏈結)和硬鏈結的一些問題,在這裡做個記錄。
cp 命令
基本用法:
cp source destination
該命令將source複製至乙個新檔案,叫destination。注意,這種複製,是真實將原始檔內容拷貝了乙份,存在了物理儲存空間。
我們使用命令ls -il來顯示檔案的長列表,會發現destination與source有不同的索引節點號(索引節點是核心分配給檔案系統中每個物件的唯一標識數字)。
root@iz28eyzqmtxz:~# lscp命令有很多引數,可以進行諸如遞迴複製整個目錄中的所有內容等。相關引數可以參看linux程式設計大全。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:~#
這裡要解釋的是-l和-s兩個引數。
雖然沒有看過linux的原始碼,但是可以推斷出這邊用到了c中的兩個特性:指標,指標的指標。
我們知道作業系統在進行儲存管理的時候,會為檔案儲存的物理空間的起點標識乙個確定的「位址」,而我們所見的檔名,其實在儲存空間中,儲存的是真實原始檔的「位址」,這個位址指向了原始檔的真實儲存空間。
如上圖,儲存空間a和儲存空間b可能是相鄰的儲存空間,也可能不是,但它們一定是兩個儲存空間存了相同的內容。
也就是說我們如果執行的是 cp -l log.txt log2.txt,實際上並沒有建立乙份新的原始檔,只是對儲存空間a新加了乙個指向它的指標。
root@iz28eyzqmtxz:~# ls這樣一來,無論我們是查詢log.txt還是log3.txt,都會先找到它們代表的0xa300的儲存空間,接著便能找到並操作原始檔。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指向同乙個原始檔,為什麼刪除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指令用在複製檔案或目錄,如同時指定兩個以上的檔案或目錄,且最後的目的地是乙個已經存在的目錄,則...