评论

收藏

[Linux] 帮你精通Linux:简约却不简单的ls命令

服务系统 服务系统 发布于:2021-09-16 21:29 | 阅读数:269 | 评论:0

ls 命令即 list directory contents是我们最为熟悉的Linux命令。它就如车载或者手机中的导航地图,彻底解放了我们的大脑,片刻不能离身。否则我们下楼取个快递,都得绕18道弯才能勉强找回家。
ls 命令即 list directory contents是我们最为熟悉的Linux命令。它就如车载或者手机中的导航地图,彻底解放了我们的大脑,片刻不能离身。否则我们下楼取个快递,都得绕18道弯才能勉强找回家。
我们在前面的“Linux手册”课程中,大量应用ls这个地图查看器。
1.只列出当前的目录文件
我们先从一个具体的问题出发,如何单单打印出目录文件。
如果使用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去掉呢?
DSC0000.png 实际的执行是将扩展的通配符的子目录全部都列了出来。
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
DSC0001.png

绝大部分时间,我们更关注的是文件的大小,-s, --size正提供这样的服务。
6.收尾总结
总结上述的方法:
# 1.只列出目录 
ls -d */ 
# 2.只列出文件 
ls *.{txt,pdf,org} 
# 3.文件大小排序 
ls -lhS 
# 4.时间戳排序 
ls -lht 
# 5.极简模式 
ls -Ss
以上本文收尾,盼对大家有点滴帮助。
原文地址:https://www.toutiao.com/i6908524368884695565/

关注下面的标签,发现更多相似文章