Linux / Mac 下 基本的 bash shell 命令詳解(touch 、cp、mv、rm)
前言
這一篇主要說了touch,cp,mv,rm這幾個很基本常用的命令。部落格會同時釋出在簡書和CSDN,希望大家支援。
處理檔案
bash shell 提供了很多在Linux檔案系統上操作檔案的命令。
建立檔案 touch
可以使用touch命令來輕鬆建立空檔案:
touch test
touch命令建立了指定的新檔案,並將當前使用者名稱作為檔案的屬主。
建立的檔案大小是零,touch命令只會建立一個空檔案。
如果再次使用:touch test
命令,當前已經存在test檔案,該命令列會使已有檔案的訪問時間和修改時間進行改變,而不改變檔案的內容。
touch -a
touch -m
:只改變修改時間;
預設情況下,touch使用當前時間,可以使用:
touch -t 引數加上特定的時間戳來制定時間
例如:touch -t 201612251200 test
複製檔案 cp
在檔案系統中將檔案和目錄從一個位置複製到另一個位置就需要使用cp命令。
最基本用法裡,cp需要兩個引數,源物件和目標物件:
cp source destination
當source的destination引數都是檔名時,cp命令將原始碼複製到一個新檔案,並且以destination命名。新檔案就像全新的檔案一樣,有新的建立時間和修改時間。如果目標檔案已經存在
同大多數命令一樣,cp命令也有一些可以提供幫助的命令列引數(當前其中部分命令列在Mac下面並沒有效果):
引數 | 描述 |
---|---|
-a | 歸檔檔案,並保留它們現在的屬性(linux檔案歸檔的意思是為檔案或目錄備份,建立歸檔檔案) |
-b | 建立已存在目錄檔案的備份,而非覆蓋它 |
-d | 保留 |
-f | 強制覆蓋已存在的目標檔案,不提示 |
-i | 在覆蓋目標檔案之前提示 |
-l | 建立檔案連結而非複製檔案 |
-p | 如果可能保留檔案屬性 |
-r | 遞迴的複製檔案 |
-R | 遞迴的複製目錄 |
-s | 建立一個符號連結而非複製檔案 |
-S | 覆蓋預設的備份檔案的字尾(預設是~) |
-u | 僅在原始檔比目標檔案新的情況下複製(相當於更新) |
-v | 詳細模式,解釋到底發生了什麼 |
-x | 僅限於當前檔案系統的複製(這句話的背景是:Linux可同時掛在多個不同的檔案系統型別的儲存裝置) |
連結檔案 cp -l cp -s
連結檔案下面的兩個引數只針對Linux有用,Mac上進過測試沒有這幾個命令引數。
你可能已經注意到,cp命令的許多引數都是針對連結檔案的。這是Linux檔案系統的一個優點。
如需要在系統上維護同一檔案的的兩份或者多份副本,除了儲存多份單獨的物理檔案副本之外。還可以採用儲存一份物理檔案副本和多個虛擬副本的方法。這種虛擬的副本就被稱為連結。連結是目錄中指向檔案真實位置的佔位符。在Linux中有兩種不同型別的檔案連結:
- 符號連結,即軟連結;
- 硬連結
硬連結會建立一個獨立檔案,其中包含了原始檔的資訊以及位置。引用硬連結檔案檔案等同於連結了原始檔:
cp -l test1 test4
-l引數建立了一個指向test1的硬連結test4。在檔案列表可看出,檔案test1和test4的索引節點號是相同的,這表明,實際上它們是同一個檔案。還要注意,連結計數表示當前這兩個檔案都有兩個連結了。
只能在同種儲存媒體上的檔案之間建立硬連結,不能在不同掛載點下的檔案間建立硬連結。在後一種情況下,可以使用軟連結。
-s引數可以建立一個符號連結,即軟連結:
cp -s test1 test5
首先,新建的test5檔案有了一個不同於test檔案的索引節點號,這說明Linux系統把它當做一個單獨的檔案。
其次,檔案變小了。連結檔案只需要儲存原始檔的資訊,並不需要儲存原始檔中的資料。
在複製檔案連結時需要注意,如果用cp命令來複制一個連結到到另一個原始檔的檔案,那麼你複製的其實是原始檔的另一個副本,而不是連結檔案的。這點很容易混淆。可以建立一個指向原始檔的新連結,而不用複製連結檔案。可以建立指向同一檔案的多個連結,但不要建立指向其他符號連結檔案的多個符號連結。這樣會生成一個連結檔案鏈,不但容易混淆,還容易斷掉,造成各種各樣的問題。
重新命名檔案 mv
在Linux中,重新命名檔案稱為移動(moving)。mv命令就是用來將檔案和目錄移動到另一個位置的:
mv test1 test2
mv test1 ../Desktop/
移動檔案會改變檔名,但保持同樣的索引節點號和時間戳。移動一個有軟連結指向檔案會帶來麻煩,會造成一個軟連結檔案指向一個無效檔案。
刪除檔案 rm
在Linux中,刪除(deleting)叫做移除(removing)。base shell 中刪除檔案的命令是rm。
rm test1
注意命令會提示是否真的要刪除檔案(Mac下不會提示)。
base shell中沒有回收站或者垃圾桶,所以一旦刪除就無法找回了。
關於rm命令的命令列引數,可以參考cp的命令列引數,大多數是一致的,以下列舉幾個常用的:
-d:直接把欲刪除的目錄的硬連線資料刪除成0,刪除該目錄;
-f:強制刪除檔案或目錄;
-i:刪除已有檔案或目錄之前先詢問使用者;
-r或-R:遞迴處理,將指定目錄下的所有檔案與子目錄一併處理;
–preserve-root:不對根目錄進行遞迴操作;
-v:顯示指令的詳細執行過程。
當輸出一個帶連結的檔案時,原始檔被刪除後,硬連結檔案內容依舊存在,而軟連結檔案時,bash會表示它已經不復存在了。
硬連結檔案採用和原始檔相同的索引節點號。硬連結會一直維護這個索引節點號來保留資料,知道刪除了最後一個連結它的檔案。
所有的軟連結檔案都知道它所指向的檔案不存在了,所以指向的也就是一個無效檔案。