Linux下 ls 命令的高階用法8例

welchang發表於2021-09-09

在Linux下,ls這個命令大家肯定太熟悉了,良許相信只要是Linux工程師,每天都會離不開這個命令,而且一天會使用個幾百次。但是,除了 ls -l 以外,你還知 ls 的哪些高階用法呢?良許今天為大家介紹 ls 命令的8種高階用法。

假如我們有這樣的一個資料夾,我們用tree命令檢視它的目錄結構:

img
img

用法1:列出/home/alvin/test_dir目錄下所有檔案及目錄的詳細資料

命令:

ls -lR /home/alvin/test_dir/
複製程式碼

結果:

[alvin@VM_0_16_centos test_dir]$ ls -lR /home/alvin/test_dir/
/home/alvin/test_dir/:
total 28
-rw-rw-r-- 1 alvin alvin   37 Nov 18 09:12 atb_aux.c
-rw-rw-r-- 1 alvin alvin    8 Nov 18 09:12 atb_can.c
-rw-rw-r-- 1 alvin alvin   24 Nov 18 09:12 atb_orch.c
-rw-rw-r-- 1 alvin alvin    5 Nov 18 09:12 atb_ota.c
drwxrwxr-x 2 alvin alvin 4096 Nov 18 09:12 include
-rw-rw-r-- 1 alvin alvin    0 Nov 18 09:12 Makefile
drwxrwxr-x 2 alvin alvin 4096 Nov 18 09:12 output
drwxrwxr-x 2 alvin alvin 4096 Nov 18 09:12 src

/home/alvin/test_dir/include:
total 0
-rw-rw-r-- 1 alvin alvin 0 Nov 18 09:12 a.h
-rw-rw-r-- 1 alvin alvin 0 Nov 18 09:12 b.h
-rw-rw-r-- 1 alvin alvin 0 Nov 18 09:12 c.h

/home/alvin/test_dir/output:
total 0
-rwxrwxr-x 1 alvin alvin 0 Nov 18 09:12 app

/home/alvin/test_dir/src:
total 0
-rw-rw-r-- 1 alvin alvin 0 Nov 18 09:12 a.c
-rw-rw-r-- 1 alvin alvin 0 Nov 18 09:12 b.c
-rw-rw-r-- 1 alvin alvin 0 Nov 18 09:12 c.c
複製程式碼

在這裡,-l 選項大家應該比較熟悉,是以列表的形式顯示結果的意思。而對於 -R 選項,意思是遞迴處理,將指定目錄下的所有檔案及子目錄一併處理。

用法2:列出/home/alvin/test_dir目錄下以atb開頭的所有檔案的詳細內容

命令:

ls -l atb*
複製程式碼

結果:

[alvin@VM_0_16_centos test_dir]$ ls -l atb*
-rw-rw-r-- 1 alvin alvin 37 Nov 18 09:12 atb_aux.c
-rw-rw-r-- 1 alvin alvin  8 Nov 18 09:12 atb_can.c
-rw-rw-r-- 1 alvin alvin 24 Nov 18 09:12 atb_orch.c
-rw-rw-r-- 1 alvin alvin  5 Nov 18 09:12 atb_ota.c
複製程式碼

用法3:只列出目錄下的子目錄

  • 方法1

命令

ls -F /home/alvin/test_dir | grep /$
複製程式碼

結果:

[alvin@VM_0_16_centos test_dir]$ ls -F /home/alvin/test_dir | grep /$
include/
output/
src/
複製程式碼

其中:-F選項表示在每個檔名後附上一個字元以說明改檔案的型別。“*”:表示可執行的普通檔案;“/”:表示目錄;“@”:表示符號連結;“|”:表示FIFOs;“=”:表示套接字。

/$ 其實是一個正規表示式,表示以 / 結尾。grep /$ 表示過濾出以 / 結尾的結果,也就是子目錄。

  • 方法2

命令:

ls -p /home/alvin/test_dir | grep /$
複製程式碼

結果:

[alvin@VM_0_16_centos test_dir]$ ls -p | grep /$
include/
output/
src/
複製程式碼

其中:-p 選項與 -F 選項類似,也是在每個檔名後附上一個字元以說明改檔案的型別。

  • 方法3

命令:

ls -l /home/alvin/test_dir | grep "^d"
複製程式碼

結果:

[alvin@VM_0_16_centos test_dir]$ ls -l /home/alvin/test_dir | grep "^d"
drwxrwxr-x 2 alvin alvin 4096 Nov 18 09:12 include
drwxrwxr-x 2 alvin alvin 4096 Nov 18 09:12 output
drwxrwxr-x 2 alvin alvin 4096 Nov 18 09:12 src
複製程式碼

其中:^d 也是一個正規表示式,表示以 d 開頭。grep "^d" 表示過濾出以 d 開頭的結果,而 ls -l 所列出來的結果,首位如果是 d 的話,表示這個檔案是個目錄,這樣就可以過濾出子目錄了。

  • 方法4

命令:

ls -d */
複製程式碼

結果:

[alvin@VM_0_16_centos test_dir]$ ls -d */
include/  output/  src/
複製程式碼

其中:-d 選項表示將目錄象檔案一樣顯示,而不顯示其下的檔案。

用法4:按時間順序列出目錄下的檔案,越新越排後面。

命令:

ls -ltr
複製程式碼

結果:

[alvin@VM_0_16_centos test_dir]$ ls -lrt
total 28
drwxrwxr-x 2 alvin alvin 4096 Nov 18 09:12 src
drwxrwxr-x 2 alvin alvin 4096 Nov 18 09:12 output
-rw-rw-r-- 1 alvin alvin    0 Nov 18 09:12 Makefile
drwxrwxr-x 2 alvin alvin 4096 Nov 18 09:12 include
-rw-rw-r-- 1 alvin alvin    5 Nov 18 09:12 atb_ota.c
-rw-rw-r-- 1 alvin alvin   24 Nov 18 09:12 atb_orch.c
-rw-rw-r-- 1 alvin alvin    8 Nov 18 09:12 atb_can.c
-rw-rw-r-- 1 alvin alvin   37 Nov 18 09:12 atb_aux.c
複製程式碼

其中:-t 選項表示以檔案修改時間排序,越新的越靠前。-r 選項表示對結果進行反向排序,二者結合的話表示以修改時間排序,越新的越靠後。

用法5:以檔案大小進行排序

命令:

ls -lhS
複製程式碼

結果:

[alvin@VM_0_16_centos test_dir]$ ls -lhS
total 28K
drwxrwxr-x 2 alvin alvin 4.0K Nov 18 09:12 include
drwxrwxr-x 2 alvin alvin 4.0K Nov 18 09:12 output
drwxrwxr-x 2 alvin alvin 4.0K Nov 18 09:12 src
-rw-rw-r-- 1 alvin alvin   37 Nov 18 09:12 atb_aux.c
-rw-rw-r-- 1 alvin alvin   24 Nov 18 09:12 atb_orch.c
-rw-rw-r-- 1 alvin alvin    8 Nov 18 09:12 atb_can.c
-rw-rw-r-- 1 alvin alvin    5 Nov 18 09:12 atb_ota.c
-rw-rw-r-- 1 alvin alvin    0 Nov 18 09:12 Makefile
複製程式碼

其中:-h 選項表示以可讀選項顯示,否則檔案大小是預設以位元組數顯示,比如:4873位元組,你知道是多少嗎?加了 -h 選項系統就幫你換算成以k或者其它單位的結果。

-S 選項表示以檔案大小進行排序,檔案越大越靠前。想要檔案小者靠前的話,加個 -r 選項就行。

用法6:統計當前目錄下的檔案數和目錄數

  • 統計檔案數

命令:

ls -l | grep "^-" | wc -l
複製程式碼

結果:

[alvin@VM_0_16_centos test_dir]$ ls -l | grep "^-" | wc -l
5
複製程式碼

其中:^- 表示以 - 開頭,即普通檔案,ls -l | grep "^-" 過濾出普通檔案,再用 wc -l統計過濾出的普通檔案的個數。

  • 統計目錄數

命令:

ls -l | grep "^d" | wc -l
複製程式碼

結果:

[alvin@VM_0_16_centos test_dir]$ ls -l | grep "^d" | wc -l
3
複製程式碼

其中:^d 表示以 d 開頭,即目錄,ls -l | grep "^d" 過濾出目錄,再用 wc -l 統計過濾出的目錄的個數。

用法7:列出所有檔案的絕對路徑

命令:

ls | sed "s:^:`pwd`/:"
複製程式碼

結果:

[alvin@VM_0_16_centos test_dir]$ ls | sed "s:^:`pwd`/:"
/home/alvin/test_dir/atb_aux.c
/home/alvin/test_dir/atb_can.c
/home/alvin/test_dir/atb_orch.c
/home/alvin/test_dir/atb_ota.c
/home/alvin/test_dir/include
/home/alvin/test_dir/Makefile
/home/alvin/test_dir/output
/home/alvin/test_dir/src
複製程式碼

其中:sed "s:^:``pwd``/:" 表示在行首增加 pwd(即檔案所在路徑),與檔名組合成絕對路徑。

用法8:列出當前目錄下的所有檔案(包括隱藏檔案)的絕對路徑, 對目錄不做遞迴

在上一個用法裡,對於隱藏檔案(即以 . 開頭的檔案)是不作處理的,如果我們需要對隱藏檔案也作處理的話,就需要使用下面這個命令:

find $PWD -maxdepth 1 | xargs ls -ld
複製程式碼

結果:

[alvin@VM_0_16_centos test_dir]$ find $PWD -maxdepth 1 | xargs ls -ld
drwxrwxr-x 5 alvin alvin 4096 Nov 18 17:30 /home/alvin/test_dir
-rw-rw-r-- 1 alvin alvin   37 Nov 18 09:12 /home/alvin/test_dir/atb_aux.c
-rw-rw-r-- 1 alvin alvin    8 Nov 18 09:12 /home/alvin/test_dir/atb_can.c
-rw-rw-r-- 1 alvin alvin   24 Nov 18 09:12 /home/alvin/test_dir/atb_orch.c
-rw-rw-r-- 1 alvin alvin    5 Nov 18 09:12 /home/alvin/test_dir/atb_ota.c
drwxrwxr-x 2 alvin alvin 4096 Nov 18 09:12 /home/alvin/test_dir/include
-rw-rw-r-- 1 alvin alvin    0 Nov 18 09:12 /home/alvin/test_dir/Makefile
drwxrwxr-x 2 alvin alvin 4096 Nov 18 09:12 /home/alvin/test_dir/output
drwxrwxr-x 2 alvin alvin 4096 Nov 18 09:12 /home/alvin/test_dir/src
複製程式碼

其中:find $PWD -maxdepth 1 限定了在當前層級(即不遞迴),再對find結果傳遞給 ls -ld 作引數,這樣就將當前目錄下的所有檔案補齊了所在路徑。

更多精彩內容,請關注公眾號良許Linux,公眾內回覆1024可免費獲得5T技術資料,包括:Linux,C/C++,Python,樹莓派,嵌入式,Java,人工智慧,等等。公眾號內回覆進群,邀請您進高手如雲技術交流群。

img


相關文章