linux ls 命令

sparkdev發表於2017-09-06

ls 命令是 Linux 下最常用的命令之一,用來查詢目錄下的內容(list directory contents)。本文將介紹其基本的用法和一些典型的用例。筆者使用的測試環境為 ubuntu 16.04。

基本輸出

直接在命令列中輸入 ls 並回車。這是最精簡的用法,因為我們省略了所有的選項和引數,輸出的結果是當前目錄下的檔名和目錄名:

檔名和目錄名稱被按照字母序混排在一起,以列為單位從左到右排列。需要注意的是此時的輸出並不包含隱藏檔案和隱藏的目錄。
如果想要調整輸出結果的排序方式,可以使用 -r 選項來逆序輸出的順序:

$ ls -r

此時以 w 開頭的名稱排在了第一個位置。-r 選項的含義為把排序方式顛倒,所以在使用其它方式排序後也可以使用這個選項來顛倒排序的結果。

顯示隱藏檔案

在 Linux 中以 . 號(dot)開頭的目錄和檔案被理解為隱藏檔案。ls 命令預設不會列出這些檔案,除非你指定了 -a 選項。-a 選項其實是顯示所有的檔案,包含隱藏的檔案和目錄。在使用者的家目錄下試試 ls -a 命令,你會發現有不少的隱藏目錄和隱藏檔案呢!

上圖中以 . 開頭的都是隱藏目錄或檔案。

使用長格式顯示更多資訊

長格式能夠提供更多的資訊,比如檔案和目錄的大小,最後更新的時間,所有者及其許可權。使用 -l (小寫的字母L) 選項可以輸出長格式的資訊:

此時每行顯示一個檔案或者目錄的資訊。第一個字母描述檔案型別:- 為一般檔案,d 為目錄,l 為符號連結。接下來的 9 個字元說明檔案許可權的資訊:針對每個使用者、組以及除此以外的其它人。r 表示讀取,w 表示寫入,x 表示執行,如果未提供許可權則是 -。

第二欄包含連結計數。第三欄和第四欄分別顯示所有者與所屬組。

第五欄則是以位元組為單位顯示的檔案大小。在 Linux 命令中,涉及到檔案大小的地方,一般預設是以位元組為單位顯示的。這樣可讀性就不是很好。所以有了 -h 選項!這個選項的全稱是 --human-readable(給人讀的)。也就是以 K, M, G 等單位來顯示檔案的大小:

在應用 l 選項的同時應用 h 選項,會以合適的單位顯示檔案大小,比如上圖中已經變成以 K 為單位顯示了。

接下來的三欄是最後修改時的時間戳。顯示的順序為月,日,年。但是仔細觀察你會發現只有一些行在年的位置顯示了年份(2017),其它的行在這個位置顯示的都是一個時間。這裡有一個規則:最後修改時間如果超過六個月才顯示為年份,六個月以內的則顯示為時間。如果你想要得到更精確的時間,可以同時使用 --full-time 選項:

此時顯示的時間精度為百萬分之一秒,並且會顯示出時區的資訊。

關於時間戳我們還需要知道另外一點,預設在這裡顯示的時間是 mtime。如果我們需要顯示 atime 或者是 ctime 該怎麼辦?此時就要用到 --time 選項來設定時間戳顯示的時間型別:

對比前面的圖片,設定為 atime 後,顯示的時間資訊發生了明顯的變化。

萬用字元

在 ls 命令中使用萬用字元有時會產生一些比較奇怪的結果,接下來筆者將嘗試解釋萬用字元在 ls 命令中的使用方式。
在 ls 命令中使用 * 和 ?等萬用字元時首先發生的是 shell 的展開!
Bash 會掃描命令列中的每一個單詞,如果在其中發現了 *, ? 或者是 [,那麼這個單詞就被認為是一個模式。然後用匹配的以字母序排列的檔名稱列表替換這個模式。說簡單點,在 ls 命令執行前,Bash 會進行模式匹配並進行替換。然後 ls 使用替換後的引數執行命令。舉個例子:

$ ls test*

如果當前目錄中有一個名為 test 的目錄和一個名為 testsql 的目錄,那麼 Bash 替換完成後命令是這個樣子:

$ ls test testsql

所以上面的命令會列出這兩個目錄下的所有檔案:

再來個例子,在使用者的家目錄下執行下面的命令:

$ ls D*

使用者家目錄下一般會存在 Desktop,Documents 和 Downloads 目錄,所以 D* 會被展開為 "Desktop Documents Downloads",最終 ls 執行的命令變成了:

$ ls Desktop Documents Downloads

這些目錄下的檔案都會被新增到命令的輸出中。
好了,當你理解了 Bash 展開的過程後,我想你就可以解釋那些乍一看讓人摸不著頭腦的輸出結果了!

關於萬用字元,還有一點需要注意:預設不會匹配到隱藏的檔案,即便指定 a 選項也不行:

如果要匹配隱藏檔案,需要顯式的指定 . 號,比如:

$ ls -d .*

這裡的 d 選項本身與隱藏檔案無關,我們會在接下來詳細介紹。

d 選項詳解

d 選項的描述為:顯示目錄自身,而不顯示其內容。所以使用 d 選項可以輕鬆的檢視當前目錄或是指定目錄的資訊:

如果去掉 d 選項則會輸出這些目錄下的內容。

d 選項還能夠在使用萬用字元過濾時保證子目錄的內容不會被輸出:

這是一種比較常見的使用方式,加上 d 選項能保證結果符合我們的預期。

我們還可以透過 d 選項過濾出當前目錄下的所有子目錄:

$ ls –d */

看上去很神奇,其實這與我們前面執行的 ls -d my* 命令是一樣的,只不過這次 Bash 過濾了以 / 號結尾的名稱,而以 / 號結尾的名稱都是目錄的名稱!

排序

ls 命令的輸出預設是以字母序排列的,只是隱藏檔案的 . 號沒有參與排序規則。除了字母序,我們還能以檔案的大小或最後修改時間為排序條件。
S 選項會以檔案的大小為條件排列輸出的結果:

預設的順序為從大到小排列,你可以使用 r 選項來反轉這個順序。需要注意的是,所有目錄的大小都是一樣的,總為 4096 位元組。

t 選項預設則以檔案的最後修改時間(mtime)為條件排列輸出的結果:

預設的順序為最新修改的檔案在最頂端,你可以使用 r 選項來反轉這個順序。這裡你還可以透過 --time 選項改變長格式輸出的時間型別(比如 atime 或 ctime),t 選項會以你指定的時間型別進行排序。

區分檔案與目錄

F 選項可以用來區分目錄與檔案。預設情況下 p 與 F 選項的表現是相同的。都是在目錄的結尾新增斜線(/):

因此在命令中我們可以透過結尾處的斜線(/)過濾出檔案:

$ ls -F |grep -v /
$ ls -p |grep -v /

或過濾出目錄:

$ ls -F |grep /$
$ ls -p |grep /$

總結

除了本文介紹的基本用法和常用的選項,ls 命令還有很多的選項可以提供更多的功能。比如 i 選項可以顯示檔案的 inode 資訊等等。所以 ls 是一個看似簡單實則功能強大的命令。

相關文章