Linux下 ls 命令的高級用法8例
在Linux下,ls這個命令大家肯定太熟悉了,良許相信只要是Linux工程師,每天都會離不開這個命令,而且一天會使用個幾百次。但是,除了 ls -l 以外,你還知 ls 的哪些高級用法呢?良許今天為大家介紹 ls 命令的8種高級用法。
假如我們有這樣的一個文件夾,我們用tree命令查看它的目錄結構:
用法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) 方法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選項表示在每個文件名后附上一個字符以說明改文件的類型。“*”:表示可執(zhí)行的普通文件;“/”:表示目錄;“@”:表示符號鏈接;“|”:表示FIFOs;“=”:表示套接字。
/$ 其實是一個正則表達式,表示以 / 結尾。grep /$ 表示過濾出以 / 結尾的結果,也就是子目錄。
(2) 方法2:
命令:
- ls -p /home/alvin/test_dir | grep /$
結果:
- [alvin@VM_0_16_centos test_dir]$ ls -p | grep /$
- include/
- output/
- src/
其中:-p 選項與 -F 選項類似,也是在每個文件名后附上一個字符以說明改文件的類型。
(3) 方法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) 方法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 選項表示以可讀選項顯示,否則文件大小是默認以字節(jié)數顯示,比如:4873字節(jié),你知道是多少嗎?加了 -h 選項系統(tǒng)就幫你換算成以k或者其它單位的結果。
-S 選項表示以文件大小進行排序,文件越大越靠前。想要文件小者靠前的話,加個 -r 選項就行。
用法6:統(tǒng)計當前目錄下的文件數和目錄數
(1) 統(tǒng)計文件數:
命令:
- ls -l | grep "^-" | wc -l
結果:
- [alvin@VM_0_16_centos test_dir]$ ls -l | grep "^-" | wc -l
- 5
其中:^- 表示以 - 開頭,即普通文件,ls -l | grep "^-" 過濾出普通文件,再用 wc -l統(tǒng)計過濾出的普通文件的個數。
(2) 統(tǒng)計目錄數:
命令:
- 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 統(tǒng)計過濾出的目錄的個數。
用法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」。良許,世界500強外企Linux開發(fā)工程師,公眾號里分享大量Linux干貨,歡迎關注!