首頁 > 軟體

Linux / Mac 下 基本的 bash shell 命令詳解

2020-06-16 17:27:12

Linux / Mac 下 基本的 bash shell 命令詳解

前言

本篇主要介紹了在Linux / Mac 系統下,一些基本的bash shell命令。

遍歷目錄 cd

cd destination

cd命令可以帶單個引數destination,用以制定你想切換到的目錄名。如果使用者沒有指定目標路徑,將會切換到當前使用者主目錄。
目錄路徑引數可以使用兩種方式表達:

  • 絕對檔案路徑
    使用者可在虛擬目錄中採用==絕對檔案路徑==來參照目錄名。絕對檔案路徑定義了在虛擬目錄結構中該目錄的確切位置,以虛擬目錄的根目錄開始,相當於目錄的全名。
    即以“/”開頭的目錄的絕對路徑,當當前所在的目錄已經在工作目錄中時,可以使用 cd / 回到根目錄。

  • 相對檔案路徑
    ==相對檔案路徑==允許使用者指定一個基於當前位置的目錄檔案路徑,而無需再從根目錄開始。相對檔案路徑不以代表根目錄的正斜線(/)開頭,而以目錄名(如果使用者準備切換到當前工作目錄下的一個目錄)或是一個表示基於使用者當前目錄的相對位置的特殊字元開始。有兩個特殊字元:

    • 單點符(.),表示當前目錄;
    • 雙點符(..),表示當前目錄的父級目錄。

    例如:

    cd ../Desktop
    cd ./Doc
    cd ../../etc

列表命令 ls

基本列表功能

命令區分大小寫。
ls命令的基本格式會顯示當前目錄下的檔案和目錄。
ls命令輸出的列表是按字母排序的(按列排序而不是按行排序)。如果使用者用的是支援彩色的終端模擬器(==Mac 電腦終端預設是沒有色彩的,可以百度新增組態檔==),ls命令還可以用不同的顏色來區分不同型別的檔案。LS_COLORS環境變數控制著這個功能。

  • ls -F:該命令會在結果中的目錄名後面加正斜線(/),以方便使用者在輸出中分辨它們。類似的,他會在可執行檔案後面加個星號,以便找出可在系統上執行的檔案。
  • ls -a:該命令可以將隱藏檔案和目錄一起顯示出來。
  • ls -R:該命令可以列出當前目錄下的包含的目錄中的檔案。如果有很多個目錄,這個輸出會很長。

修改輸出資訊

ls命令並沒有輸出每個檔案額太多相關資訊。需要顯示更多的資訊,需要使用改命令:

  • ls -l:該引數會產生長列表格式的輸出,包含了目錄中每個檔案的更多的相關資訊:
    這種超列表格式的輸出在每一行中列出了單個檔案或目錄。除了檔名,輸出中還有其他有用資訊。輸出的第一行顯示了目錄中包含的塊的總數。之後每一行都包含了關於檔案(或目錄)的下述資訊:
    • 檔案型別,比如目錄(d)、檔案(-)、字元型檔案(c)或者塊檔案(b);
    • 檔案的許可權;
    • 檔案的硬連結總數;
    • 檔案屬主的使用者名稱;
    • 檔案屬主的組名;
    • 檔案的大小(已位元組為單位);
    • 檔案的上次修改時間;
    • 檔名或目錄名。

完整的參數列

在進行檔案管理時,ls命令的很多引數可能會派上用場。針對ls執行一下man命令,你就能看到可用來修改ls命令輸出的引數就有好幾頁。man ls
ls命令採用兩種格式的命令列引數:

  • 單字母引數;
  • 全字母引數;

單字母引數通常是由英文破折號開始,全字引數則更易於看懂,通常以雙英文破折號開始。許多引數都有單字母和全字母兩種版本,而有些則只有一種。

==Mac 終端下,測試了幾個命令並不用輸入“–”,直接輸入“-”加後面的命令即可,還有就是下表的一些命令,在Mac 並沒有響應。目前不知道是測試輸入錯誤還是本身並不支援。==

單字母全字描述
-a –all 輸出包括以“.”打頭的隱藏檔案
-A –almost-all 不要輸出“.”和“..”檔案
  –author 輸出每個檔案的作者
-b –escape 輸出不可列印的字元的八進位制值
  –block-size=size 按照size位元組的大小來計算大小塊(快數)
-B –ignore-backups 不要列出名稱中包含波浪線(~)的條目(波浪線用來表示備份的副本)
-c   按最後一次修改時間排序
-C   按列輸出條目
  –color=when 何時使用彩色(always,never或者auto)
-d –directory 列出目錄條目而非內容,並且不用跟蹤符號連結
-F –classify 給條目追加檔案型別識別符號
  –file-type 只在部分檔案型別(非可執行檔案)後追加檔案型別識別符號
  –format=word 將輸出格式化成across(交叉)、commas(逗號)。horizontal(水平)、long(長)、single-column(單列)、verbose(詳細)或vertical(垂直)
-g   輸出除檔案屬主之外所有資訊
  –group-directories-first 在檔案之前列出所有目錄
-G –no-group 在長列表輸出格式下,不顯示組名
-h –human-readable 列印大小,K表示千位元組
  –si 和-h相同,但進率為1000,而非1024
-i –inode 顯示每個檔案的所有值(inode)
-l   按長列表輸出格式顯示
-L –dereference 對於連結檔案,顯示原檔案資訊
-n –numeric-uid-gid 顯示數位型別的userid和groupid以替代名字
-o   在長列表格式下不顯示組名
-r –reverse 在輸出檔案和目錄時,反轉排序的順序
-R –recursive 遞迴的列出子目錄的內容
-s –size 輸出每個檔案的塊大小
-S –sort=size 按檔案大小排序輸出
-t –sort=time 按檔案修改時間排序輸出
-u   輸出檔案的最後存取時間而非最後修改時間
-U –sort=none 不要將輸出排序
-v –sort=version 將檔案版本排序輸出
-x   按行而非按列輸出條目
-X –sort=extension 按副檔名排序輸出

如果需要,也可以一次使用多個引數。多個雙破折線引數必須分開輸入,而多個單波折線可以組合成一個字串跟在一個單破折線後面。例如:ls -alis單命令無關順序。

過濾輸出列表

由前面的例子可以知道,預設情況下,ls命令會輸出目錄下的所有檔案。
ls命令還支援在命令列下定義過濾器。它會用過濾器決定應該在輸出中顯示哪些檔案和目錄。
這個過濾器就是個進行簡單文字匹配的的字串,可以在要用的命令列引數後新增這個過濾器:

ls -l 匹配字串

當使用者指定特定的檔名稱作為過濾器時,ls命令只會顯示那個檔案的資訊。
有時候當不知道要找的檔案的確切名稱。ls命令可以識別標準萬用字元,並在過濾器中用它們來進行模式匹配:

  • 問好代表一個字元。
  • 星號代表零個或多個字元。

問號可用在過濾器字串中替代任意位置的單個字元。
例如:

ls -l mypro?
ls -l mypro*

處理檔案

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命令將會提示你是否要覆蓋已有檔案。

同大多數命令一樣,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會表示它已經不復存在了。
硬連結檔案採用和原始檔相同的索引節點號。硬連結會一直維護這個索引節點號來保留資料,知道刪除了最後一個連結它的檔案。
所有的軟連結檔案都知道它所指向的檔案不存在了,所以指向的也就是一個無效檔案。

處理檔案

建立目錄

在Linux中建立目錄使用mkdir命令。

mkdir finder

系統會建立一個新目錄,並給它分配一個新的索引節點號。

刪除目錄

base shell會盡可能的防止使用者誤刪目錄。刪除目錄的基本命令是:rmdir:

rmdir finder

預設情況下,rmdir命令只刪除空目錄。可以使用--ignore-fail-on-non-empty引數來刪除非空目錄。

當然rm命令也可以使用,由於刪除的是目錄,所以一般情況下需要加-r引數,來遞回刪除目錄。
一般用的最多的就是rm -rf,遞回強制刪除。

檢視檔案內容

檢視檔案統計內容 stat

stat 命令可以提供檔案系統上某個檔案的所有狀態資訊:

stat test

stat 會顯示檔案的基本資訊,但是不會顯示當前檔案的型別。

檢視檔案型別 file

file命令就是用來檢視檔案型別的命令。

file test

file命令將檔案分成3類:

  • 文字檔案:可列印字元的檔案。
  • 可執行檔案:可在系統上執行的檔案。
  • 資料檔案:包含不可列印的二進位制字元、又不能在系統上執行的檔案。

當檔案是文字檔案時,file命令可以判斷出該檔案包含文字,還判斷出文字的字元編碼;
當檔案是文字指令碼檔案時,會判斷出可以在系統上執行;
當檔案是二進位制可執行程式時,file命令可以判斷出檔案編譯時面向的平台,以及它需要哪種型別的庫。如果你有從未知來源獲得的二進位制檔案,這會是個非常有用的特性。

檢視整個檔案 cat more less

cat命令

cat命令是顯示文字檔案中所有資料的得力助手。

cat test
  • cat -n test :給所有行加上行號;
  • cat -b test :只給有文字的行加上行號;
  • cat -s test :將多個空白行壓縮到單個空白行;
  • cat -K test :將製表符使用^I字元組合替換文中所有製表符。

對大型檔案來說,cat命令會有點繁瑣,檔案的文字會在顯示器上一晃而過。

more 命令

more命令會顯示文字檔案的內容,但會在顯示每頁資料之後停下來,並且在螢幕底部顯示一個more標籤,並顯示現在在文字檔案中的位置。
more命令的選項:

選項描述
H 顯示幫助選單
spacebar 顯示文字檔案的下一屏
z 顯示檔案文字的下一屏
ENTER 顯示文字檔案的下一行
d 顯示檔案文字的後面半屏(會更新11行)
q 退出程式
s 顯示檔案文字的下一行
f 顯示下一屏檔案文字
b 顯示上一屏檔案文字
/expression 在檔案中查詢匹配文字表示式的內容
n 在檔案中查詢下一處匹配已制定表示式的內容
跳到指定表示式匹配到的第一處內容
!cmd 執行shell命令
v 在當前行啟動vi編輯器
CTRL-L 重繪當前行
= 顯示當前行在檔案中的行號
. 重複執行前一個命令

more命令只支援文字檔案中基本的移動。

less命令

less 命令是more命令的升級版本,提供了一些極為實用的在文字檔案中前後翻動的功能,還有一些極先進的搜尋功能。

less命令會提供一些額外的資訊:顯示了檔案的總行數以及現在顯示的行號區間。less命令支援了more命令支援的所有引數,同事還多了一些選項。

檢視部分檔案 tail head

tail命令

tail命令會顯示檔案末尾部分的內容。預設情況下會顯示檔案的末尾10行。

引數描述
-c bytes 顯示檔案最後的bytes個位元組的字元
-n lines 顯示檔案最後的lines行
-f 讓tail程式一直保持在活動狀態,如果有新的內容加到檔案的末尾就顯示出來
–pid=PID 和引數-f一起,跟蹤一個檔案知道進程ID為PID的進程結束
-s sec 和-f引數一起,在每次回圈輸出之間休眠sec秒
-v 總是顯示帶檔名的頭
-q 從不顯示帶檔名的頭

-f引數是tail命令的一個突出特性,它允許你在其他進程使用該檔案時檢視檔案的內容。tail命令會保持活動狀態並不斷的顯示新增到檔案中的內容。這是實時監測系統紀錄檔的絕妙方式。

head 命令

head命令會顯示檔案開頭那些行的內容。預設情況下,它會顯示檔案前10行的文字。類似於tail命令,支援-c -n引數,但是不支援-f引數。

本文永久更新連結地址http://www.linuxidc.com/Linux/2016-11/137599.htm


IT145.com E-mail:sddin#qq.com