8 個 Linux 下 ls 命令的高階用法!個個驚豔!
作者 | 良許
責編 | 胡巍巍
在Linux下,ls這個命令大家肯定太熟悉了,筆者相信只要是Linux工程師,每天都會離不開這個命令,而且一天會使用個幾百次。
但是,除了ls -l以外,你還知ls的哪些高階用法呢?筆者今天為大家介紹ls命令的8種高階用法。
假如我們有這樣的一個資料夾,我們用tree命令檢視它的目錄結構:
用法1:列出/home/alvin/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方面乾貨,歡迎關注。
宣告:本文為作者投稿,版權歸其個人所有。
推薦閱讀:
點選“閱讀原文”,開啟 APP 閱讀更順暢