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

ls 命令即 list directory contents是我们最为熟悉的Linux命令。它就如车载或者手机中的导航地图,彻底解放了我们的大脑,片刻不能离身。否则我们下楼取个快递,都得绕18道弯才能勉强找回家。

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

ls 命令即 list directory contents是我们最为熟悉的Linux命令。它就如车载或者手机中的导航地图,彻底解放了我们的大脑,片刻不能离身。否则我们下楼取个快递,都得绕18道弯才能勉强找回家。

我们在前面的“Linux手册”课程中,大量应用ls这个地图查看器。

1.只列出当前的目录文件

我们先从一个具体的问题出发,如何单单打印出目录文件。

如果使用find命令,不仅简单,而且符合完全语义化的表达:

  1. $ find . -maxdepth 1 -type d | head
  2. .
  3. ./Templates
  4. ./.ssh
  5. ./.tldr
  6. ./.zoom
  7. ./.presage
  8. ./Videos
  9. ./.racket
  10. ./.mplayer
  11. ./node_modules

我们甚至可以调用echo

  1. $ echo */
  2. 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的选项:

  1. -d, –directory
  2.              list directories themselves, not their contents

直接运行试试:

  1. $ ls -d .
  2. .  # 只返回了一个当前目录

改用通配符:

  1. $ ls -d */
  2.  anaconda3/          Downloads/         News/           snap/
  3.  backup.doom.d/      dwhelper/          node_modules/   Templates/
  4. ‘Calibre Library/’   emacs.d.backup2/   org/            Test/
  5.  Desktop/            Mail/              Pictures/       Videos/
  6.  Documents/          Music/             Public/

如果将d去掉呢?

帮你精通Linux:简约却不简单的ls命令 
实际的执行是将扩展的通配符的子目录全部都列了出来。

2.只列出当前的文件

那么如何单单列出来当前的文件呢?最简单的方法还是 find 命令的语义化查询:

  1. $ find . -maxdepth 1 -type f -iname “[^.]*” |nl
  2.      1  ./#*message*-20191127-125216#
  3.      2  ./package-lock.json
  4.      3  ./start.sh
  5.      4  ./backup.gnus.el
  6.      5  ./zero-config.el
  7.      6  ./RMAIL
  8.      7  ./linux-tutorial.org
  9.      8  ./linux-tutorial-2.org
  10.      9  ./*scratch*

我们知道ls命令有-F(filter)选项,将所有的文件归类:

  1. $ ls -F
  2.  anaconda3/                          News/
  3.  Anaconda3-2020.02-Linux-x86_64.sh   node_modules/
  4.  backup.doom.d/                      org/
  5.  backup.gnus.el                      package-lock.json
  6. ‘Calibre Library’/                   Pictures/
  7.  Desktop/                            Public/
  8.  Documents/                          RMAIL
  9.  Downloads/                         ‘*scratch*’
  10.  dwhelper/                           snap/
  11.  emacs.d.backup2/                    start.sh*
  12.  linux-tutorial-2.org                Templates/
  13.  linux-tutorial.org                  Test/
  14.  Mail/                               Videos/
  15. ‘#*message*-20191127-125216#’        zero-config.el
  16.  Music/

于是我们考虑使用组合命令:

  1. $ ls -F |grep .*[^/]$ |nl
  2.      1  backup.gnus.el
  3.      2  linux-tutorial-2.org
  4.      3  linux-tutorial.org
  5.      4  #*message*-20191127-125216#
  6.      5  package-lock.json
  7.      6  RMAIL
  8.      7  *scratch*
  9.      8  start.sh*
  10.      9  zero-config.el

或者:

  1. $ ls -l |grep ^- |nl
  2.      1  -rw-rw-r—  1 gaowei gaowei   6042 Feb  4 21:23 backup.gnus.el
  3.      2  -rw-rw-r—  2 gaowei gaowei    892 May 26 08:34 linux-tutorial-2.org
  4.      3  -rw-rw-r—  2 gaowei gaowei    892 May 26 08:34 linux-tutorial.org
  5.      4  -rw-rw-r—  1 gaowei gaowei    139 Nov 27  2019 #*message*-20191127-125216#
  6.      5  -rw-rw-r—  1 gaowei gaowei    313 Dec 10  2019 package-lock.json
  7.      6  -rw-rw-r—  1 gaowei gaowei  74109 Mar 17 14:27 RMAIL
  8.      7  -rw-rw-r—  1 gaowei gaowei    497 Dec  5  2019 *scratch*
  9.      8  -rwxr-xr-x  1 gaowei gaowei   1793 May  7 06:20 start.sh
  10.      9  -rw-rw-r—  1 gaowei gaowei   1058 Mar 30 17:10 zero-config.el

至此我们可以得出结论,ls并没有直接列出全部文件的方案。

3.列出指定类型文件

虽然没有列出全部文件的方法,然而我们却可以打印指定suffix的文件:

  1. $ ls *.org # org 文件
  2. linux-tutorial-2.org  linux-tutorial.org
  3. $ ls *.sh # shell文件
  4. start.sh

而且可以讲二者组合:

  1. $ ls *.{org,sh}
  2. linux-tutorial-2.org  linux-tutorial.org  start.sh

4.无处不在的排序

排序无处不在,两个小学生考试也要排排名次。

我们首先想到的是sort命令。

  1. $ ls -lh | sort -k 5 -h |head
  2. total 320K
  3. -rw-rw-r—  1 gaowei gaowei  139 Nov 27  2019 #*message*-20191127-125216#
  4. -rw-rw-r—  1 gaowei gaowei  313 Dec 10  2019 package-lock.json
  5. -rw-rw-r—  1 gaowei gaowei  497 Dec  5  2019 *scratch*
  6. -rw-rw-r—  2 gaowei gaowei  892 May 26 08:34 linux-tutorial-2.org
  7. -rw-rw-r—  2 gaowei gaowei  892 May 26 08:34 linux-tutorial.org
  8. -rw-rw-r—  1 gaowei gaowei 1.1K Mar 30 17:10 zero-config.el
  9. -rwxr-xr-x  1 gaowei gaowei 1.8K May  7 06:20 start.sh
  10. drwx——  5 gaowei gaowei 4.0K Feb  4 21:32 Mail
  11. drwxrwxr-x 10 gaowei gaowei 4.0K Mar 19 17:46 emacs.d.backup2

颇为惊喜的是,ls 贴心的准备了 -S 选项,并且,更为贴心的是输出的结果是倒序排列。

  1. $ ls -lhS |head
  2. total 320K
  3. drwxr-xr-x 13 gaowei gaowei 100K Jun 22 15:02 Downloads
  4. -rw-rw-r—  1 gaowei gaowei  73K Mar 17 14:27 RMAIL
  5. drwxr-xr-x  8 gaowei gaowei  20K Jun 23 20:01 Videos
  6. drwxr-xr-x  3 gaowei gaowei  12K Apr 28 04:50 Desktop
  7. drwxr-xr-x  7 gaowei gaowei  12K Jun 20 21:15 Pictures
  8. -rw-rw-r—  1 gaowei gaowei 6.0K Feb  4 21:23 backup.gnus.el
  9. drwxrwxr-x 26 gaowei gaowei 4.0K Jun 16 09:02 anaconda3
  10. drwxrwxr-x  2 gaowei gaowei 4.0K Jan 27 13:11 backup.doom.d
  11. drwxrwxr-x  6 gaowei gaowei 4.0K Feb 21 16:17 Calibre Library

-S 是长选项–sort的短写形式,除了按文件大小排序,也可以按照时间排序等

  1. $ ls -lh –sort=time  |head #简写为 ls -ht
  2. total 320K
  3. drwxr-xr-x  8 gaowei gaowei  20K Jun 23 20:01 Videos
  4. drwxr-xr-x 13 gaowei gaowei 100K Jun 22 15:02 Downloads
  5. drwxr-xr-x  7 gaowei gaowei  12K Jun 20 21:15 Pictures
  6. drwxrwxr-x 26 gaowei gaowei 4.0K Jun 16 09:02 anaconda3
  7. drwxr-xr-x  4 gaowei gaowei 4.0K Jun 15 18:01 snap
  8. drwxr-xr-x 15 gaowei gaowei 4.0K Jun  2 10:53 Documents
  9. drwxrwxr-x  2 gaowei gaowei 4.0K May 26 10:50 Test
  10. -rw-rw-r—  2 gaowei gaowei  892 May 26 08:34 linux-tutorial-2.org
  11. -rw-rw-r—  2 gaowei gaowei  892 May 26 08:34 linux-tutorial.org

5.极简模式

有时候,我们阅读-l选项下的结果,眼花缭乱,头晕目眩。此时可以尝试极简模式:

  1. $ ls -sS

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

绝大部分时间,我们更关注的是文件的大小,-s, –size正提供这样的服务。

6.收尾总结

总结上述的方法:

  1. # 1.只列出目录
  2. ls -d */
  3. # 2.只列出文件
  4. ls *.{txt,pdf,org}
  5. # 3.文件大小排序
  6. ls -lhS
  7. # 4.时间戳排序
  8. ls -lht
  9. # 5.极简模式
  10. ls -Ss

以上本文收尾,盼对大家有点滴帮助。

原创文章,作者:小 编,如若转载,请注明出处:https://www.mzbky.com/3045.html

发表评论

登录后才能评论