1. 程式人生 > >linux ls 命令

linux ls 命令

rep 同時 輸出 設置 code family ges 奇怪 去掉

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 是一個看似簡單實則功能強大的命令。

linux ls 命令