幫你精通Linux:簡約卻不簡單的ls命令
ls 命令即 list directory contents是我們最為熟悉的Linux命令。它就如車載或者手機中的導航地圖,徹底解放了我們的大腦,片刻不能離身。否則我們下樓取個快遞,都得繞18道彎才能勉強找回家。
我們在前面的“Linux手冊”課程中,大量應用ls這個地圖查看器。
1.只列出當前的目錄文件
我們先從一個具體的問題出發(fā),如何單單打印出目錄文件。
如果使用find命令,不僅簡單,而且符合完全語義化的表達:
- $ find . -maxdepth 1 -type d | head
- .
- ./Templates
- ./.ssh
- ./.tldr
- ./.zoom
- ./.presage
- ./Videos
- ./.racket
- ./.mplayer
- ./node_modules
我們甚至可以調用echo
- $ echo */
- anaconda3/ backup.doom.d/ Calibre Library/ Desktop/ Documents/ Downloads/ dwhelper/ emacs.d.backup2/ Mail/ Music/ News/ node_modules/ org/ Pictures/ Public/ snap/ Templates/ Test/ Videos/
查閱手冊,我們會看到-d的選項:
- -d, --directory
- list directories themselves, not their contents
直接運行試試:
- $ ls -d .
- . # 只返回了一個當前目錄
改用通配符:
- $ ls -d */
- anaconda3/ Downloads/ News/ snap/
- backup.doom.d/ dwhelper/ node_modules/ Templates/
- 'Calibre Library/' emacs.d.backup2/ org/ Test/
- Desktop/ Mail/ Pictures/ Videos/
- Documents/ Music/ Public/
如果將d去掉呢?

實際的執(zhí)行是將擴展的通配符的子目錄全部都列了出來。
2.只列出當前的文件
那么如何單單列出來當前的文件呢?最簡單的方法還是 find 命令的語義化查詢:
- $ find . -maxdepth 1 -type f -iname "[^.]*" |nl
- 1 ./#*message*-20191127-125216#
- 2 ./package-lock.json
- 3 ./start.sh
- 4 ./backup.gnus.el
- 5 ./zero-config.el
- 6 ./RMAIL
- 7 ./linux-tutorial.org
- 8 ./linux-tutorial-2.org
- 9 ./*scratch*
我們知道ls命令有-F(filter)選項,將所有的文件歸類:
- $ ls -F
- anaconda3/ News/
- Anaconda3-2020.02-Linux-x86_64.sh node_modules/
- backup.doom.d/ org/
- backup.gnus.el package-lock.json
- 'Calibre Library'/ Pictures/
- Desktop/ Public/
- Documents/ RMAIL
- Downloads/ '*scratch*'
- dwhelper/ snap/
- emacs.d.backup2/ start.sh*
- linux-tutorial-2.org Templates/
- linux-tutorial.org Test/
- Mail/ Videos/
- '#*message*-20191127-125216#' zero-config.el
- Music/
于是我們考慮使用組合命令:
- $ ls -F |grep .*[^/]$ |nl
- 1 backup.gnus.el
- 2 linux-tutorial-2.org
- 3 linux-tutorial.org
- 4 #*message*-20191127-125216#
- 5 package-lock.json
- 6 RMAIL
- 7 *scratch*
- 8 start.sh*
- 9 zero-config.el
或者:
- $ ls -l |grep ^- |nl
- 1 -rw-rw-r-- 1 gaowei gaowei 6042 Feb 4 21:23 backup.gnus.el
- 2 -rw-rw-r-- 2 gaowei gaowei 892 May 26 08:34 linux-tutorial-2.org
- 3 -rw-rw-r-- 2 gaowei gaowei 892 May 26 08:34 linux-tutorial.org
- 4 -rw-rw-r-- 1 gaowei gaowei 139 Nov 27 2019 #*message*-20191127-125216#
- 5 -rw-rw-r-- 1 gaowei gaowei 313 Dec 10 2019 package-lock.json
- 6 -rw-rw-r-- 1 gaowei gaowei 74109 Mar 17 14:27 RMAIL
- 7 -rw-rw-r-- 1 gaowei gaowei 497 Dec 5 2019 *scratch*
- 8 -rwxr-xr-x 1 gaowei gaowei 1793 May 7 06:20 start.sh
- 9 -rw-rw-r-- 1 gaowei gaowei 1058 Mar 30 17:10 zero-config.el
至此我們可以得出結論,ls并沒有直接列出全部文件的方案。
3.列出指定類型文件
雖然沒有列出全部文件的方法,然而我們卻可以打印指定suffix的文件:
- $ ls *.org # org 文件
- linux-tutorial-2.org linux-tutorial.org
- $ ls *.sh # shell文件
- start.sh
而且可以講二者組合:
- $ ls *.{org,sh}
- linux-tutorial-2.org linux-tutorial.org start.sh
4.無處不在的排序
排序無處不在,兩個小學生考試也要排排名次。
我們首先想到的是sort命令。
- $ ls -lh | sort -k 5 -h |head
- total 320K
- -rw-rw-r-- 1 gaowei gaowei 139 Nov 27 2019 #*message*-20191127-125216#
- -rw-rw-r-- 1 gaowei gaowei 313 Dec 10 2019 package-lock.json
- -rw-rw-r-- 1 gaowei gaowei 497 Dec 5 2019 *scratch*
- -rw-rw-r-- 2 gaowei gaowei 892 May 26 08:34 linux-tutorial-2.org
- -rw-rw-r-- 2 gaowei gaowei 892 May 26 08:34 linux-tutorial.org
- -rw-rw-r-- 1 gaowei gaowei 1.1K Mar 30 17:10 zero-config.el
- -rwxr-xr-x 1 gaowei gaowei 1.8K May 7 06:20 start.sh
- drwx------ 5 gaowei gaowei 4.0K Feb 4 21:32 Mail
- drwxrwxr-x 10 gaowei gaowei 4.0K Mar 19 17:46 emacs.d.backup2
頗為驚喜的是,ls 貼心的準備了 -S 選項,并且,更為貼心的是輸出的結果是倒序排列。
- $ ls -lhS |head
- total 320K
- drwxr-xr-x 13 gaowei gaowei 100K Jun 22 15:02 Downloads
- -rw-rw-r-- 1 gaowei gaowei 73K Mar 17 14:27 RMAIL
- drwxr-xr-x 8 gaowei gaowei 20K Jun 23 20:01 Videos
- drwxr-xr-x 3 gaowei gaowei 12K Apr 28 04:50 Desktop
- drwxr-xr-x 7 gaowei gaowei 12K Jun 20 21:15 Pictures
- -rw-rw-r-- 1 gaowei gaowei 6.0K Feb 4 21:23 backup.gnus.el
- drwxrwxr-x 26 gaowei gaowei 4.0K Jun 16 09:02 anaconda3
- drwxrwxr-x 2 gaowei gaowei 4.0K Jan 27 13:11 backup.doom.d
- drwxrwxr-x 6 gaowei gaowei 4.0K Feb 21 16:17 Calibre Library
-S 是長選項--sort的短寫形式,除了按文件大小排序,也可以按照時間排序等
- $ ls -lh --sort=time |head #簡寫為 ls -ht
- total 320K
- drwxr-xr-x 8 gaowei gaowei 20K Jun 23 20:01 Videos
- drwxr-xr-x 13 gaowei gaowei 100K Jun 22 15:02 Downloads
- drwxr-xr-x 7 gaowei gaowei 12K Jun 20 21:15 Pictures
- drwxrwxr-x 26 gaowei gaowei 4.0K Jun 16 09:02 anaconda3
- drwxr-xr-x 4 gaowei gaowei 4.0K Jun 15 18:01 snap
- drwxr-xr-x 15 gaowei gaowei 4.0K Jun 2 10:53 Documents
- drwxrwxr-x 2 gaowei gaowei 4.0K May 26 10:50 Test
- -rw-rw-r-- 2 gaowei gaowei 892 May 26 08:34 linux-tutorial-2.org
- -rw-rw-r-- 2 gaowei gaowei 892 May 26 08:34 linux-tutorial.org
5.極簡模式
有時候,我們閱讀-l選項下的結果,眼花繚亂,頭暈目眩。此時可以嘗試極簡模式:
- $ ls -sS
絕大部分時間,我們更關注的是文件的大小,-s, --size正提供這樣的服務。
6.收尾總結
總結上述的方法:
- # 1.只列出目錄
- ls -d */
- # 2.只列出文件
- ls *.{txt,pdf,org}
- # 3.文件大小排序
- ls -lhS
- # 4.時間戳排序
- ls -lht
- # 5.極簡模式
- ls -Ss
以上本文收尾,盼對大家有點滴幫助。