Linux / Mac 下 基本的 bash shell 命令詳解
前言
本篇主要介紹了在Linux / Mac 系統(tǒng)下,一些基本的bash shell命令。
遍歷目錄 cd
cd destination
cd命令可以帶單個(gè)參數(shù)destination,用以制定你想切換到的目錄名。如果用戶沒有指定目標(biāo)路徑,將會(huì)切換到當(dāng)前用戶主目錄。
目錄路徑參數(shù)可以使用兩種方式表達(dá):
絕對(duì)文件路徑
用戶可在虛擬目錄中采用==絕對(duì)文件路徑==來引用目錄名。絕對(duì)文件路徑定義了在虛擬目錄結(jié)構(gòu)中該目錄的確切位置,以虛擬目錄的根目錄開始,相當(dāng)于目錄的全名。
即以“/”開頭的目錄的絕對(duì)路徑,當(dāng)當(dāng)前所在的目錄已經(jīng)在工作目錄中時(shí),可以使用cd /
回到根目錄。-
相對(duì)文件路徑
==相對(duì)文件路徑==允許用戶指定一個(gè)基于當(dāng)前位置的目錄文件路徑,而無需再從根目錄開始。相對(duì)文件路徑不以代表根目錄的正斜線(/)開頭,而以目錄名(如果用戶準(zhǔn)備切換到當(dāng)前工作目錄下的一個(gè)目錄)或是一個(gè)表示基于用戶當(dāng)前目錄的相對(duì)位置的特殊字符開始。有兩個(gè)特殊字符:- 單點(diǎn)符(.),表示當(dāng)前目錄;
- 雙點(diǎn)符(..),表示當(dāng)前目錄的父級(jí)目錄。
例如:
cd ../Desktop cd ./Doc cd ../../etc
列表命令 ls
基本列表功能
命令區(qū)分大小寫。
ls命令的基本格式會(huì)顯示當(dāng)前目錄下的文件和目錄。
ls命令輸出的列表是按字母排序的(按列排序而不是按行排序)。如果用戶用的是支持彩色的終端模擬器(==Mac 電腦終端默認(rèn)是沒有色彩的,可以百度添加配置文件==),ls命令還可以用不同的顏色來區(qū)分不同類型的文件。LS_COLORS
環(huán)境變量控制著這個(gè)功能。
-
ls -F
:該命令會(huì)在結(jié)果中的目錄名后面加正斜線(/),以方便用戶在輸出中分辨它們。類似的,他會(huì)在可執(zhí)行文件后面加個(gè)星號(hào),以便找出可在系統(tǒng)上運(yùn)行的文件。 -
ls -a
:該命令可以將隱藏文件和目錄一起顯示出來。 -
ls -R
:該命令可以列出當(dāng)前目錄下的包含的目錄中的文件。如果有很多個(gè)目錄,這個(gè)輸出會(huì)很長。
修改輸出信息
ls命令并沒有輸出每個(gè)文件額太多相關(guān)信息。需要顯示更多的信息,需要使用改命令:
-
ls -l
:該參數(shù)會(huì)產(chǎn)生長列表格式的輸出,包含了目錄中每個(gè)文件的更多的相關(guān)信息:
這種超列表格式的輸出在每一行中列出了單個(gè)文件或目錄。除了文件名,輸出中還有其他有用信息。輸出的第一行顯示了目錄中包含的塊的總數(shù)。之后每一行都包含了關(guān)于文件(或目錄)的下述信息:- 文件類型,比如目錄(d)、文件(-)、字符型文件(c)或者塊文件(b);
- 文件的權(quán)限;
- 文件的硬鏈接總數(shù);
- 文件屬主的用戶名;
- 文件屬主的組名;
- 文件的大小(已字節(jié)為單位);
- 文件的上次修改時(shí)間;
- 文件名或目錄名。
完整的參數(shù)列表
在進(jìn)行文件管理時(shí),ls命令的很多參數(shù)可能會(huì)派上用場(chǎng)。針對(duì)ls運(yùn)行一下man命令,你就能看到可用來修改ls命令輸出的參數(shù)就有好幾頁。man ls
ls命令采用兩種格式的命令行參數(shù):
- 單字母參數(shù);
- 全字母參數(shù);
單字母參數(shù)通常是由英文破折號(hào)開始,全字參數(shù)則更易于看懂,通常以雙英文破折號(hào)開始。許多參數(shù)都有單字母和全字母兩種版本,而有些則只有一種。
==Mac 終端下,測(cè)試了幾個(gè)命令并不用輸入“--”,直接輸入“-”加后面的命令即可,還有就是下表的一些命令,在Mac 并沒有響應(yīng)。目前不知道是測(cè)試輸入錯(cuò)誤還是本身并不支持。==
單字母 | 全字 | 描述 |
---|---|---|
-a | --all | 輸出包括以“.”打頭的隱藏文件 |
-A | --almost-all | 不要輸出“.”和“..”文件 |
--author | 輸出每個(gè)文件的作者 | |
-b | --escape | 輸出不可打印的字符的八進(jìn)制值 |
--block-size=size | 按照size字節(jié)的大小來計(jì)算大小塊(快數(shù)) | |
-B | --ignore-backups | 不要列出名稱中包含波浪線(~)的條目(波浪線用來表示備份的副本) |
-c | 按最后一次修改時(shí)間排序 | |
-C | 按列輸出條目 | |
--color=when | 何時(shí)使用彩色(always,never或者auto) | |
-d | --directory | 列出目錄條目而非內(nèi)容,并且不用跟蹤符號(hào)鏈接 |
-F | --classify | 給條目追加文件類型標(biāo)識(shí)符 |
--file-type | 只在部分文件類型(非可執(zhí)行文件)后追加文件類型標(biāo)識(shí)符 | |
--format=word | 將輸出格式化成across(交叉)、commas(逗號(hào))。horizontal(水平)、long(長)、single-column(單列)、verbose(詳細(xì))或vertical(垂直) | |
-g | 輸出除文件屬主之外所有信息 | |
--group-directories-first | 在文件之前列出所有目錄 | |
-G | --no-group | 在長列表輸出格式下,不顯示組名 |
-h | --human-readable | 打印大小,K表示千字節(jié) |
--si | 和-h相同,但進(jìn)率為1000,而非1024 | |
-i | --inode | 顯示每個(gè)文件的所有值(inode) |
-l | 按長列表輸出格式顯示 | |
-L | --dereference | 對(duì)于鏈接文件,顯示原文件信息 |
-n | --numeric-uid-gid | 顯示數(shù)字類型的userid和groupid以替代名字 |
-o | 在長列表格式下不顯示組名 | |
-r | --reverse | 在輸出文件和目錄時(shí),反轉(zhuǎn)排序的順序 |
-R | --recursive | 遞歸的列出子目錄的內(nèi)容 |
-s | --size | 輸出每個(gè)文件的塊大小 |
-S | --sort=size | 按文件大小排序輸出 |
-t | --sort=time | 按文件修改時(shí)間排序輸出 |
-u | 輸出文件的最后訪問時(shí)間而非最后修改時(shí)間 | |
-U | --sort=none | 不要將輸出排序 |
-v | --sort=version | 將文件版本排序輸出 |
-x | 按行而非按列輸出條目 | |
-X | --sort=extension | 按文件擴(kuò)展名排序輸出 |
如果需要,也可以一次使用多個(gè)參數(shù)。多個(gè)雙破折線參數(shù)必須分開輸入,而多個(gè)單波折線可以組合成一個(gè)字符串跟在一個(gè)單破折線后面。例如:ls -alis
。單命令無關(guān)順序。
過濾輸出列表
由前面的例子可以知道,默認(rèn)情況下,ls命令會(huì)輸出目錄下的所有文件。
ls命令還支持在命令行下定義過濾器。它會(huì)用過濾器決定應(yīng)該在輸出中顯示哪些文件和目錄。
這個(gè)過濾器就是個(gè)進(jìn)行簡單文本匹配的的字符串,可以在要用的命令行參數(shù)后添加這個(gè)過濾器:
ls -l 匹配字符串
當(dāng)用戶指定特定的文件名稱作為過濾器時(shí),ls命令只會(huì)顯示那個(gè)文件的信息。
有時(shí)候當(dāng)不知道要找的文件的確切名稱。ls命令可以識(shí)別標(biāo)準(zhǔn)通配符,并在過濾器中用它們來進(jìn)行模式匹配:
- 問好代表一個(gè)字符。
- 星號(hào)代表零個(gè)或多個(gè)字符。
問號(hào)可用在過濾器字符串中替代任意位置的單個(gè)字符。
例如:
ls -l mypro?
ls -l mypro*
處理文件
bash shell 提供了很多在Linux文件系統(tǒng)上操作文件的命令。
創(chuàng)建文件 touch
可以使用touch命令來輕松創(chuàng)建空文件:
touch test
touch命令創(chuàng)建了指定的新文件,并將當(dāng)前用戶名作為文件的屬主。
創(chuàng)建的文件大小是零,touch命令只會(huì)創(chuàng)建一個(gè)空文件。
如果再次使用:touch test
命令,當(dāng)前已經(jīng)存在test文件,該命令行會(huì)使已有文件的訪問時(shí)間和修改時(shí)間進(jìn)行改變,而不改變文件的內(nèi)容。
-
touch -a
:只修改訪問時(shí)間; -
touch -m
:只改變修改時(shí)間;
默認(rèn)情況下,touch使用當(dāng)前時(shí)間,可以使用:
-
touch -t 參數(shù)加上特定的時(shí)間戳來制定時(shí)間
例如:touch -t 201612251200 test
復(fù)制文件 cp
在文件系統(tǒng)中將文件和目錄從一個(gè)位置復(fù)制到另一個(gè)位置就需要使用cp命令。
最基本用法里,cp需要兩個(gè)參數(shù),源對(duì)象和目標(biāo)對(duì)象:
cp source destination
當(dāng)source的destination參數(shù)都是文件名時(shí),cp命令將源代碼復(fù)制到一個(gè)新文件,并且以destination命名。新文件就像全新的文件一樣,有新的創(chuàng)建時(shí)間和修改時(shí)間。如果目標(biāo)文件已經(jīng)存在了,那么cp命令將會(huì)提示你是否要覆蓋已有文件。
同大多數(shù)命令一樣,cp命令也有一些可以提供幫助的命令行參數(shù)(當(dāng)前其中部分命令行在Mac下面并沒有效果):
參數(shù) | 描述 |
---|---|
-a | 歸檔文件,并保留它們現(xiàn)在的屬性(linux文件歸檔的意思是為文件或目錄備份,建立歸檔文件) |
-b | 創(chuàng)建已存在目錄文件的備份,而非覆蓋它 |
-d | 保留 |
-f | 強(qiáng)制覆蓋已存在的目標(biāo)文件,不提示 |
-i | 在覆蓋目標(biāo)文件之前提示 |
-l | 創(chuàng)建文件鏈接而非復(fù)制文件 |
-p | 如果可能保留文件屬性 |
-r | 遞歸的復(fù)制文件 |
-R | 遞歸的復(fù)制目錄 |
-s | 創(chuàng)建一個(gè)符號(hào)鏈接而非復(fù)制文件 |
-S | 覆蓋默認(rèn)的備份文件的后綴(默認(rèn)是~) |
-u | 僅在源文件比目標(biāo)文件新的情況下復(fù)制(相當(dāng)于更新) |
-v | 詳細(xì)模式,解釋到底發(fā)生了什么 |
-x | 僅限于當(dāng)前文件系統(tǒng)的復(fù)制(這句話的背景是:Linux可同時(shí)掛在多個(gè)不同的文件系統(tǒng)類型的存儲(chǔ)設(shè)備) |
鏈接文件 cp -l cp -s
鏈接文件下面的兩個(gè)參數(shù)只針對(duì)Linux有用,Mac上進(jìn)過測(cè)試沒有這幾個(gè)命令參數(shù)。
你可能已經(jīng)注意到,cp命令的許多參數(shù)都是針對(duì)鏈接文件的。這是Linux文件系統(tǒng)的一個(gè)優(yōu)點(diǎn)。
如需要在系統(tǒng)上維護(hù)同一文件的的兩份或者多份副本,除了保存多份單獨(dú)的物理文件副本之外。還可以采用保存一份物理文件副本和多個(gè)虛擬副本的方法。這種虛擬的副本就被稱為鏈接。鏈接是目錄中指向文件真實(shí)位置的占位符。在Linux中有兩種不同類型的文件鏈接:
- 符號(hào)鏈接,即軟鏈接;
- 硬鏈接
硬鏈接會(huì)創(chuàng)建一個(gè)獨(dú)立文件,其中包含了源文件的信息以及位置。引用硬鏈接文件文件等同于鏈接了源文件:
cp -l test1 test4
-l參數(shù)創(chuàng)建了一個(gè)指向test1的硬鏈接test4。在文件列表可看出,文件test1和test4的索引節(jié)點(diǎn)號(hào)是相同的,這表明,實(shí)際上它們是同一個(gè)文件。還要注意,鏈接計(jì)數(shù)表示當(dāng)前這兩個(gè)文件都有兩個(gè)鏈接了。
只能在同種存儲(chǔ)媒體上的文件之間創(chuàng)建硬鏈接,不能在不同掛載點(diǎn)下的文件間創(chuàng)建硬鏈接。在后一種情況下,可以使用軟鏈接。
-s參數(shù)可以創(chuàng)建一個(gè)符號(hào)鏈接,即軟鏈接:
cp -s test1 test5
首先,新建的test5文件有了一個(gè)不同于test文件的索引節(jié)點(diǎn)號(hào),這說明Linux系統(tǒng)把它當(dāng)做一個(gè)單獨(dú)的文件。
其次,文件變小了。鏈接文件只需要存儲(chǔ)源文件的信息,并不需要存儲(chǔ)源文件中的數(shù)據(jù)。
在復(fù)制文件鏈接時(shí)需要注意,如果用cp命令來復(fù)制一個(gè)鏈接到到另一個(gè)源文件的文件,那么你復(fù)制的其實(shí)是源文件的另一個(gè)副本,而不是鏈接文件的。這點(diǎn)很容易混淆。可以創(chuàng)建一個(gè)指向源文件的新鏈接,而不用復(fù)制鏈接文件。可以創(chuàng)建指向同一文件的多個(gè)鏈接,但不要?jiǎng)?chuàng)建指向其他符號(hào)鏈接文件的多個(gè)符號(hào)鏈接。這樣會(huì)生成一個(gè)鏈接文件鏈,不但容易混淆,還容易斷掉,造成各種各樣的問題。
重命名文件 mv
在Linux中,重命名文件稱為移動(dòng)(moving)。mv命令就是用來將文件和目錄移動(dòng)到另一個(gè)位置的:
mv test1 test2
mv test1 ../Desktop/
移動(dòng)文件會(huì)改變文件名,但保持同樣的索引節(jié)點(diǎn)號(hào)和時(shí)間戳。移動(dòng)一個(gè)有軟鏈接指向文件會(huì)帶來麻煩,會(huì)造成一個(gè)軟鏈接文件指向一個(gè)無效文件。
刪除文件 rm
在Linux中,刪除(deleting)叫做移除(removing)。base shell 中刪除文件的命令是rm。
rm test1
注意命令會(huì)提示是否真的要?jiǎng)h除文件(Mac下不會(huì)提示)。
base shell中沒有回收站或者垃圾桶,所以一旦刪除就無法找回了。
關(guān)于rm命令的命令行參數(shù),可以參考cp的命令行參數(shù),大多數(shù)是一致的,以下列舉幾個(gè)常用的:
-d:直接把欲刪除的目錄的硬連接數(shù)據(jù)刪除成0,刪除該目錄;
-f:強(qiáng)制刪除文件或目錄;
-i:刪除已有文件或目錄之前先詢問用戶;
-r或-R:遞歸處理,將指定目錄下的所有文件與子目錄一并處理;
--preserve-root:不對(duì)根目錄進(jìn)行遞歸操作;
-v:顯示指令的詳細(xì)執(zhí)行過程。
當(dāng)輸出一個(gè)帶鏈接的文件時(shí),源文件被刪除后,硬鏈接文件內(nèi)容依舊存在,而軟鏈接文件時(shí),bash會(huì)表示它已經(jīng)不復(fù)存在了。
硬鏈接文件采用和源文件相同的索引節(jié)點(diǎn)號(hào)。硬鏈接會(huì)一直維護(hù)這個(gè)索引節(jié)點(diǎn)號(hào)來保留數(shù)據(jù),知道刪除了最后一個(gè)鏈接它的文件。
所有的軟鏈接文件都知道它所指向的文件不存在了,所以指向的也就是一個(gè)無效文件。
處理文件
創(chuàng)建目錄
在Linux中創(chuàng)建目錄使用mkdir命令。
mkdir finder
系統(tǒng)會(huì)創(chuàng)建一個(gè)新目錄,并給它分配一個(gè)新的索引節(jié)點(diǎn)號(hào)。
刪除目錄
base shell會(huì)盡可能的防止用戶誤刪目錄。刪除目錄的基本命令是:rmdir:
rmdir finder
默認(rèn)情況下,rmdir命令只刪除空目錄。可以使用--ignore-fail-on-non-empty
參數(shù)來刪除非空目錄。
當(dāng)然rm命令也可以使用,由于刪除的是目錄,所以一般情況下需要加-r參數(shù),來遞歸刪除目錄。
一般用的最多的就是rm -rf
,遞歸強(qiáng)制刪除。
查看文件內(nèi)容
查看文件統(tǒng)計(jì)內(nèi)容 stat
stat 命令可以提供文件系統(tǒng)上某個(gè)文件的所有狀態(tài)信息:
stat test
stat 會(huì)顯示文件的基本信息,但是不會(huì)顯示當(dāng)前文件的類型。
查看文件類型 file
file命令就是用來查看文件類型的命令。
file test
file命令將文件分成3類:
- 文本文件:可打印字符的文件。
- 可執(zhí)行文件:可在系統(tǒng)上運(yùn)行的文件。
- 數(shù)據(jù)文件:包含不可打印的二進(jìn)制字符、又不能在系統(tǒng)上運(yùn)行的文件。
當(dāng)文件是文本文件時(shí),file命令可以判斷出該文件包含文本,還判斷出文本的字符編碼;
當(dāng)文件是文本腳本文件時(shí),會(huì)判斷出可以在系統(tǒng)上運(yùn)行;
當(dāng)文件是二進(jìn)制可執(zhí)行程序時(shí),file命令可以判斷出文件編譯時(shí)面向的平臺(tái),以及它需要哪種類型的庫。如果你有從未知來源獲得的二進(jìn)制文件,這會(huì)是個(gè)非常有用的特性。
查看整個(gè)文件 cat more less
cat命令
cat命令是顯示文本文件中所有數(shù)據(jù)的得力助手。
cat test
-
cat -n test
:給所有行加上行號(hào); -
cat -b test
:只給有文本的行加上行號(hào); -
cat -s test
:將多個(gè)空白行壓縮到單個(gè)空白行; -
cat -K test
:將制表符使用^I字符組合替換文中所有制表符。
對(duì)大型文件來說,cat命令會(huì)有點(diǎn)繁瑣,文件的文本會(huì)在顯示器上一晃而過。
more 命令
more命令會(huì)顯示文本文件的內(nèi)容,但會(huì)在顯示每頁數(shù)據(jù)之后停下來,并且在屏幕底部顯示一個(gè)more標(biāo)簽,并顯示現(xiàn)在在文本文件中的位置。
more命令的選項(xiàng):
選項(xiàng) | 描述 |
---|---|
H | 顯示幫助菜單 |
spacebar | 顯示文本文件的下一屏 |
z | 顯示文件文本的下一屏 |
ENTER | 顯示文本文件的下一行 |
d | 顯示文件文本的后面半屏(會(huì)更新11行) |
q | 退出程序 |
s | 顯示文件文本的下一行 |
f | 顯示下一屏文件文本 |
b | 顯示上一屏文件文本 |
/expression | 在文件中查找匹配文本表達(dá)式的內(nèi)容 |
n | 在文件中查找下一處匹配已制定表達(dá)式的內(nèi)容 |
' | 跳到指定表達(dá)式匹配到的第一處內(nèi)容 |
!cmd | 執(zhí)行shell命令 |
v | 在當(dāng)前行啟動(dòng)vi編輯器 |
CTRL-L | 重繪當(dāng)前行 |
= | 顯示當(dāng)前行在文件中的行號(hào) |
. | 重復(fù)執(zhí)行前一個(gè)命令 |
more命令只支持文本文件中基本的移動(dòng)。
less命令
less 命令是more命令的升級(jí)版本,提供了一些極為實(shí)用的在文本文件中前后翻動(dòng)的功能,還有一些極先進(jìn)的搜索功能。
less命令會(huì)提供一些額外的信息:顯示了文件的總行數(shù)以及現(xiàn)在顯示的行號(hào)區(qū)間。less命令支持了more命令支持的所有參數(shù),同事還多了一些選項(xiàng)。
查看部分文件 tail head
tail命令
tail命令會(huì)顯示文件末尾部分的內(nèi)容。默認(rèn)情況下會(huì)顯示文件的末尾10行。
參數(shù) | 描述 |
---|---|
-c bytes | 顯示文件最后的bytes個(gè)字節(jié)的字符 |
-n lines | 顯示文件最后的lines行 |
-f | 讓tail程序一直保持在活動(dòng)狀態(tài),如果有新的內(nèi)容加到文件的末尾就顯示出來 |
--pid=PID | 和參數(shù)-f一起,跟蹤一個(gè)文件知道進(jìn)程ID為PID的進(jìn)程結(jié)束 |
-s sec | 和-f參數(shù)一起,在每次循環(huán)輸出之間休眠sec秒 |
-v | 總是顯示帶文件名的頭 |
-q | 從不顯示帶文件名的頭 |
-f參數(shù)是tail命令的一個(gè)突出特性,它允許你在其他進(jìn)程使用該文件時(shí)查看文件的內(nèi)容。tail命令會(huì)保持活動(dòng)狀態(tài)并不斷的顯示添加到文件中的內(nèi)容。這是實(shí)時(shí)監(jiān)測(cè)系統(tǒng)日志的絕妙方式。
head 命令
head命令會(huì)顯示文件開頭那些行的內(nèi)容。默認(rèn)情況下,它會(huì)顯示文件前10行的文本。類似于tail命令,支持-c -n參數(shù),但是不支持-f參數(shù)。