Linux命令系列之ls——原来最简单的ls这么复杂

ls命令应该是我们最常用的命令之一了,但是我们可能容易忽略那些看起来最简单的东西。

简介

ls命令的使用格式如下

ls [选项] [具体的文件] # [] 表示可选
  • 直接在命令行输入ls将当前目录下的列出当前目录下的文件和目录。
$ls
LICENSE README.md hello.c
  • 也可以指定具体的目录和文件
$ls /
bin dev home lib32 libx32 mnt proc run srv tmp var
boot etc lib lib64 media opt root sbin sys usr
  • 展示隐藏文件(所谓隐藏文件就是以.开头的目录或者文件),增加-a选项。
$ls -a
. .. .git LICENSE README.md hello.c # . 表示当前目录 .. 表示上一级目录
  • 展示文件的详细信息。
$ls -al
total 44
drwxr-xr-x 3 root root 4096 Oct 6 04:20 .
drwx------ 1 root root 4096 Oct 7 03:16 ..
drwxr-xr-x 8 root root 4096 Aug 26 15:28 .git
-rw-r--r-- 1 root root 18027 Aug 26 15:28 LICENSE
-rw-r--r-- 1 root root 210 Aug 26 15:28 README.md
-rw-r--r-- 1 root root 72 Aug 26 15:32 hello.c

详细信息说明

我们现在来仔细分析一下ls输出结果:

第一行 total 44,表示这个目录下面所有的文件的大小总和,单位是KiB

然后是接下来的每一行,每一行的开头都有10个字符,他们的含义具体如下:

文件类型说明

第一个字符,有的是d, 有的是-,在linux系统当中,这第一个字符表示文件的类型,他有如下几种类型:

  • d,表示目录,比如说上面的.当前目录,..上一级的目录。
  • -,表示一般的文件,比如说上面的hello.c.
  • b,表示块设备,比如我们的磁盘就是一种块设备,他们的这个位置都是b
$ls -al /dev/ | grep sda
brw-rw---- 1 root disk 8, 0 Apr 30 23:16 sda
brw-rw---- 1 root disk 8, 1 Apr 30 23:16 sda1
brw-rw---- 1 root disk 8, 2 Apr 30 23:16 sda2
brw-rw---- 1 root disk 8, 3 Apr 30 23:16 sda3
  • l,表示一个符号链接文件,也叫做软链接。比如我们创建一个软链接文件,并且查看它,软链接就相当于windows中的快捷方式,它并不真正的去存储数据,简单说来只是存储来一个指向一个文件的链接。
$ln -s hello.c softlink.c
$ls -al
total 52
drwxr-xr-x 3 root root 4096 Oct 7 03:39 .
drwx------ 1 root root 4096 Oct 7 03:33 ..
drwxr-xr-x 8 root root 4096 Aug 26 15:28 .git
-rw-r--r-- 1 root root 18027 Aug 26 15:28 LICENSE
-rw-r--r-- 1 root root 210 Aug 26 15:28 README.md
-rw-r--r-- 3 root root 72 Aug 26 15:32 copy.c
-rw-r--r-- 3 root root 72 Aug 26 15:32 dcopy.c
-rw-r--r-- 3 root root 72 Aug 26 15:32 hello.c
lrwxrwxrwx 1 root root 7 Oct 7 03:39 softlink.c -> hello.c # 这里就表示是软链接
  • p,表示一个管道,我们在进行多进程通信的时候可能需要使用到这个设备文件。比如我们创建一个具体的管道:
$mkfifo test
$ll
total 52
drwxr-xr-x 3 root root 4096 Oct 7 05:06 ./
drwx------ 1 root root 4096 Oct 7 03:40 ../
drwxr-xr-x 8 root root 4096 Aug 26 15:28 .git/
-rw-r--r-- 1 root root 18027 Aug 26 15:28 LICENSE
-rw-r--r-- 1 root root 210 Aug 26 15:28 README.md
-rw-r--r-- 3 root root 72 Aug 26 15:32 copy.c
-rw-r--r-- 3 root root 72 Aug 26 15:32 dcopy.c
-rw-r--r-- 3 root root 72 Aug 26 15:32 hello.c
lrwxrwxrwx 1 root root 7 Oct 7 03:39 softlink.c -> hello.c
prw-r--r-- 1 root root 0 Oct 7 05:06 test # 这里就是我么你创建的管道
  • s,这个表示一个套接字,用于网络通信。

权限说明

对于后面9个字符来说,是用于表示文件的相关权限的。对于每一种文件来说,它主要有三个权限,读、写和执行,我们很容易理解这三种权限,对于一个文件来说我们当然是想要读和写的,对于有的文件来说我们希望他是可执行的。我们稍后具体具一个例子,我们先来看这个9个位置分表表示的含义。

在这9个位置的字符当中如果是用-表示,则说明没有对应的权限,如果是用对应的r,w,x表示,则说明有对应的权限。这9个字符每三个字符是一组,第一组表示文件的作者的权限,第二组表示作者所在组内的其他人的权限,第三组表示其他人的权限,也就是除了作者和作者所在的组之外的其他人的权限。

比如在上图当中有一个可执行文件a.out,但是当我们使用chmod命令将他的所有的可执行权限都删掉的时候他就不可以被执行了,程序输出的结果表示没有权限。在没有修改之前,作者、组和其他人的权限为-rwxr-xr-x,所有的这些人都有可执行的权限。但是当执行命令chmod -x a.out之后去除了所有人的可执行权限之后,再想执行a.out就会报错了,表示权限不够,如果我们还想执行a.out的话就需要将权限重新加回去:

上面主要谈到了关于权限的问题,我们现在来好好谈一谈chmod命令,这条命令主要是用来修改文件的权限的,比如上面那样。在chmod当中我们可以有如下的几种方式去修改文件的权限:

  • 直接通过+r+w+x-r-w-x去修改三个不同的位置的权限,具体如下面这个例子所示。

  • 除此之外我们还可以指定特定的人或者组。

  • 在上面的例子当中我们还使用数组去表示权限,因为不管是那中类型的用户都有三种权限,每一种权限有具有两种状态,有这个权限和没有这个权限。那么每一个位置都可以使用一个二进制位进行表示,当二进制位为1的时候就说明有这个权限,为0的时候就没有这个权限。那么三个二进制位就表示一类用户(作者、组和其他),因此每一个用户的权限我们可以用三个二进制数进行表示,比如在上图当中的chmod 746 hello.c这条命令的输出结果和下图当中是相互对应的,打击可以仔细对照的思考一下。

其他说明

至此我们已经完成了ls输出的第一步分析,接下来我们来看第二行,第二行输出的数据是文件的链接的数目。对于目录来说这个链接的数目就是子目录的数目,对于文件来说就是硬链接的数量。对于一个新创建的文件来说硬链接的数目为1,我们可以是使用ln命令去增加一个文件的硬链接的数量,比如下图

硬链接和软链接的主要区别就是,软链接不会影响链接的数量,他只是指向一个文件,而硬链接不一样,他会增加一个文件链接的数量,当我们删除一个文件的时候事实上并不是直接将这个文件从磁盘当中删除,而是将这个文件的链接数减去一,当这个链接数等于0的时候才会删除这个文件,而删除一个软链接是不会影响链接的数量的,他只是在被发现是软链接的时候去读它指向的那个文件的内容。

第三列和第四列主要是用户名和用户所在的组的组名。第五列是文件的大小,单位是Byte。后面三列是文件上一次修改时间分别对应月、日、分秒,最后一列则是文件名。

彩蛋

  • 我们可以使用stat命令去查看一个文件详细的元数据信息,这些信息是存储在文件的inode信息里面的。
$stat hello.c
File: hello.c
Size: 72 Blocks: 8 IO Block: 4096 regular file
Device: 91h/145d Inode: 1577767 Links: 3
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2022-10-07 05:41:32.685021010 +0000
Modify: 2022-10-07 05:41:27.547021008 +0000
Change: 2022-10-07 05:41:27.552021008 +0000
Birth: 2022-08-26 15:32:43.726183003 +0000

对应的信息如下:

  • ls -R 递归列出子目录当中的文件。

  • ls -S 根据文件大小排序

  • ls - t 根据最后一次修改时间排序。

  • ls -r 逆序排列。


以上就是本篇文章的所有内容了,我是LeHung,我们下期再见!!!更多精彩内容合集可访问项目:https://github.com/Chang-LeHung/CSCore

关注公众号:一无是处的研究僧,了解更多计算机(Java、Python、计算机系统基础、算法与数据结构)知识。

Linux命令系列之ls——原来最简单的ls这么复杂的更多相关文章

  1. (3)lscpu详解 (每周一个linux命令系列)

    (3)lscpu详解 (每周一个linux命令系列) linux命令 lscpu详解 引言:今天的命令是用来看cpu信息的lscpu lscpu 我们先看man lscpu display infor ...

  2. (5)ps详解 (每周一个linux命令系列)

    (5)ps详解 (每周一个linux命令系列) linux命令 ps详解 引言:今天的命令是用来看进程状态的ps命令 ps 我们先看man ps ps - report a snapshot of t ...

  3. (4)top详解 (每周一个linux命令系列)

    (4)top详解 (每周一个linux命令系列) linux命令 top详解 引言:今天的命令是用来看cpu信息的top top 我们先看man top top - display Linux pro ...

  4. (2)free详解 (每周一个linux命令系列)

    (2)free详解 (每周一个linux命令系列) linux命令 free详解 引言:今天的命令是用来看内存的free free 换一个套路,我们先看man free中对free的描述: Displ ...

  5. Linux命令系列之top——里面藏着很多鲜为人知的宝藏知识

    Linux命令系列之top--里面藏着很多鲜为人知的宝藏知识 简介 top命令是我们经常用来查看系统信息的一个指令,它提供了一个动态的而且是实时的借口帮助我们去查看系统执行时的进程.线程和系统参数的信 ...

  6. 全网最详细的Linux命令系列-ls命令

    Linux开始必须要会的命令当属ls,在日常工作中用到ls命令时的频率是很多的,作为一个初学者,可能我只会或者顶多ls -l两种用法.但是ls其实是一个非常实用的指令,ls命令就是list的缩写,ls ...

  7. 全网最详细的Linux命令系列-Find命令

    Find工具实战 Find工具实战,Find工具主要用于操作系统文件.目录的查找,其语法参数格式为: find path -option [ -print ] [ -exec -ok command ...

  8. 全网最详细的Linux命令系列-less命令

    less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有弹性.在 more 的时候,我们并没有办法向前面翻 ...

  9. 推荐linux命令在线查,简约而不简单

    1.相关介绍: 网址:http://blog.51yip.com/linux/1518.html#more-1518 2.Linux 命令在线sce 网址:http://linux.51yip.com ...

随机推荐

  1. DML添加数据&删除数据&修改数据

    DML:增删改表中数据 1.添加数据: 语法:insert into 表名(列名1,列名2).... values(值1,值2): 注意: 1.列名和值要一一对应. 2.如果表名后,不定义列名,则默认 ...

  2. Linux学习系列--用户(组)新增、查看和删除

    在实际的工作中,在接触Linux的用户组管理的时候,一般来说都是在系统开建设的时候设置好,root权限由特定的负责人保管用户密码,避免误操作带来不必要的麻烦. 在具体使用的时候,会利用相关的命令设置一 ...

  3. kubernetes之资源限制及QOS服务质量

    1.什么是资源限制? 1.1在kubernetes集群中,为了使得系统能够稳定的运行,通常会对Pod的资源使用量进行限制.在kubernetes集群中,如果有一个程序出现异常,并且占用大量的系统资源, ...

  4. YII学习总结4(cookie操作)

    cookie操作 <?php namespace app\controllers; use yii\web\Controller; use yii\web\Cookie; class Hello ...

  5. Python Flask Blueprint 蓝图

    Python Flask Blueprint 蓝图 本篇来了解一下 Flask 中 Blueprint 蓝图,什么蓝图 ..就是一个分模块的扩展而已,用来让不同的 业务模块api 分到不同的pytho ...

  6. Spark: Cluster Computing with Working Sets

    本文是对spark作者早期论文<Spark: Cluster Computing with Working Sets>做的翻译(谷歌翻译),文章比较理论,阅读起来稍微有些吃力,但读完之后总 ...

  7. 青山不遮,毕竟东流,集成Web3.0身份钱包MetaMask以太坊一键登录(Tornado6+Vue.js3)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_213 上世纪九十年代,海湾战争的时候,一位美军军官担心他们的五角大楼会被敌人的一枚导弹干掉,从而导致在全球的美军基地处于瘫痪状态. ...

  8. odoo14 重启服务后权限不见了

    1 Odoo14权限更新有两个地方: 2 一.你在编写xml权限记录的时候没有将noupdate设置为'1'这样导致你每次升级模块,你的权限都会重置一遍. 3 二.你在运行odoo-bin服务的时候, ...

  9. InnoDB 中不同SQL语句设置的锁

    锁定读.UPDATE 或 DELETE 通常会给在SQL语句处理过程扫描到的每个索引记录上设置记录锁.语句中是否存在排除该行的WHERE条件并不重要.InnoDB不记得确切的WHERE条件,但只知道哪 ...

  10. 你有对象类,我有结构体,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang结构体(struct)的使用EP06

    再续前文,在面向对象层面,Python做到了超神:万物皆为对象,而Ruby,则干脆就是神:飞花摘叶皆可对象.二者都提供对象类操作以及继承的方式为面向对象张目,但Go lang显然有一些特立独行,因为它 ...