1. 程式人生 > >8 個 Linux 下 ls 命令的高階用法!個個驚豔!

8 個 Linux 下 ls 命令的高階用法!個個驚豔!

640?wx_fmt=gif

640?wx_fmt=jpeg

作者 | 良許

責編 | 胡巍巍

在Linux下,ls這個命令大家肯定太熟悉了,筆者相信只要是Linux工程師,每天都會離不開這個命令,而且一天會使用個幾百次。

但是,除了ls -l以外,你還知ls的哪些高階用法呢?筆者今天為大家介紹ls命令的8種高階用法。

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

640?wx_fmt=png

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

命令:


  

ls -lR /home/alvin/test_dir/

結果:


  

[[email protected]

_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*

結果:


  

[[email protected]_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 /$

結果:


  

[[email protected]_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 /$

結果:


  

[[email protected]_0_16_centos test_dir]$ ls -p | grep /$
include/
output/
src/

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

方法3:

命令:


  

ls -l /home/alvin/test_dir | grep "^d"

結果:


  

[[email protected]_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 */

結果:


  

[[email protected]_0_16_centos test_dir]$ ls -d */
include/  output/  src/

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

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

命令:


  

ls -ltr

結果:


  

[[email protected]_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

結果:


  

[[email protected]_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

結果:


  

[[email protected]_0_16_centos test_dir]$ ls -l | grep "^-" | wc -l
5

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

統計目錄數:

命令:


  

ls -l | grep "^d" | wc -l

結果:


  

[[email protected]_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`/:"

結果:


  

[[email protected]_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

結果:


  

[[email protected]_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作引數,這樣就將當前目錄下的所有檔案補齊了所在路徑。

作者:良許,目前就職於一家世界500強外企,專注於Linux應用開發。本文首發於個人公眾號「良許Linux」主要分享Linux方面乾貨,歡迎關注。

宣告:本文為作者投稿,版權歸其個人所有。

推薦閱讀:

640?wx_fmt=gif

640?wx_fmt=gif

640?wx_fmt=gif

點選“閱讀原文”,開啟 APP 閱讀更順暢