小蚂蚁 发表于 2021-9-16 21:29:18

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

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去掉呢?
实际的执行是将扩展的通配符的子目录全部都列了出来。
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

   1backup.gnus.el

   2linux-tutorial-2.org

   3linux-tutorial.org

   4#*message*-20191127-125216#

   5package-lock.json

   6RMAIL

   7*scratch*

   8start.sh*

   9zero-config.el
或者:


$ ls -l |grep ^- |nl

   1-rw-rw-r--1 gaowei gaowei   6042 Feb4 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 272019 #*message*-20191127-125216#

   5-rw-rw-r--1 gaowei gaowei    313 Dec 102019 package-lock.json

   6-rw-rw-r--1 gaowei gaowei74109 Mar 17 14:27 RMAIL

   7-rw-rw-r--1 gaowei gaowei    497 Dec52019 *scratch*

   8-rwxr-xr-x1 gaowei gaowei   1793 May7 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.orglinux-tutorial.org

$ ls *.sh # shell文件

start.sh
而且可以讲二者组合:


$ ls *.{org,sh}

linux-tutorial-2.orglinux-tutorial.orgstart.sh
4.无处不在的排序
排序无处不在,两个小学生考试也要排排名次。
我们首先想到的是sort命令。


$ ls -lh | sort -k 5 -h |head

total 320K

-rw-rw-r--1 gaowei gaowei139 Nov 272019 #*message*-20191127-125216#

-rw-rw-r--1 gaowei gaowei313 Dec 102019 package-lock.json

-rw-rw-r--1 gaowei gaowei497 Dec52019 *scratch*

-rw-rw-r--2 gaowei gaowei892 May 26 08:34 linux-tutorial-2.org

-rw-rw-r--2 gaowei gaowei892 May 26 08:34 linux-tutorial.org

-rw-rw-r--1 gaowei gaowei 1.1K Mar 30 17:10 zero-config.el

-rwxr-xr-x1 gaowei gaowei 1.8K May7 06:20 start.sh

drwx------5 gaowei gaowei 4.0K Feb4 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 gaowei73K Mar 17 14:27 RMAIL

drwxr-xr-x8 gaowei gaowei20K Jun 23 20:01 Videos

drwxr-xr-x3 gaowei gaowei12K Apr 28 04:50 Desktop

drwxr-xr-x7 gaowei gaowei12K Jun 20 21:15 Pictures

-rw-rw-r--1 gaowei gaowei 6.0K Feb4 21:23 backup.gnus.el

drwxrwxr-x 26 gaowei gaowei 4.0K Jun 16 09:02 anaconda3

drwxrwxr-x2 gaowei gaowei 4.0K Jan 27 13:11 backup.doom.d

drwxrwxr-x6 gaowei gaowei 4.0K Feb 21 16:17 Calibre Library
-S 是长选项--sort的短写形式,除了按文件大小排序,也可以按照时间排序等


$ ls -lh --sort=time|head #简写为 ls -ht

total 320K

drwxr-xr-x8 gaowei gaowei20K Jun 23 20:01 Videos

drwxr-xr-x 13 gaowei gaowei 100K Jun 22 15:02 Downloads

drwxr-xr-x7 gaowei gaowei12K Jun 20 21:15 Pictures

drwxrwxr-x 26 gaowei gaowei 4.0K Jun 16 09:02 anaconda3

drwxr-xr-x4 gaowei gaowei 4.0K Jun 15 18:01 snap

drwxr-xr-x 15 gaowei gaowei 4.0K Jun2 10:53 Documents

drwxrwxr-x2 gaowei gaowei 4.0K May 26 10:50 Test

-rw-rw-r--2 gaowei gaowei892 May 26 08:34 linux-tutorial-2.org

-rw-rw-r--2 gaowei gaowei892 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
以上本文收尾,盼对大家有点滴帮助。
原文地址:https://www.toutiao.com/i6908524368884695565/

http://www.zzvips.com/article/125436.html
页: [1]
查看完整版本: 帮你精通Linux:简约却不简单的ls命令