作者:Jack xu

半导体知识分享第27期

技能升级,从这里开始

Linux文件与目录管理常用命令解析ΙΙ

1 linux中三种time(atime,mtime,ctime)

1.1Linux下一个文件也有三种时间属性

(1)访问时间(access time 简写为atime):

显示的是文件中的数据最后被访问的时间,比如系统的进程直接使用或通过一些命令和脚本间接使用(执行一些可执行文件或脚本)。

(2)修改时间(modify time 简写为mtime):

显示的是文件内容被修改的最后时间,比如用vi编辑时就会被改变(也就是Block的内容)。

(3)状态修改时间(change time 简写为ctime):

显示的是文件的权限、拥有者、所属的组、链接数发生改变时的时间。当然当内容改变时也会随之改变(即inode内容发生改变和Block内容发生改变时)。

1.2查看三种时间的方法

ls -l    获取文件最后一次内容修改的时间(modification time(mtime));

ls -lu   获取文件最后一次访问的时间(change time(ctime));

ls -lc   获取文件最后一次状态的改变时间(access time(atime))。

2修改文件时间或者创建新文件

绝对路径和相对路径在shell环境中经常遇到,各有用处。

2.1touch

touch命令有两个功能:一是用于把已存在文件的时间标签更新为系统当前的时间(默认方式),它们的数据将原封不动地保留下来;二是用来创建新的空文件。

• 语法

在SQLite中查询距离已知坐标点最近的坐标_chmod 777命令

• 选项

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_02

• 参数

文件:指定要设置时间属性的文件列表。

• 实例

使用指令"touch"修改文件"testfile"的时间属性为当前系统时间,输入如下命令:

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_03

首先,使用ls命令查看testfile文件的属性,如下所示:

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_04

执行指令"touch"修改文件属性以后,并再次查看该文件的时间属性,如下所示:

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_05

使用指令"touch"时,如果指定的文件不存在,则将创建一个新的空白文件。例如,在当前目录下,使用该指令创建一个空白文件"file",输入如下命令:

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_06

3文件与目录的默认权限与隐藏权限

3.1umask

umask命令用来设置限制新建文件权限的掩码。当新文件被创建时,其最初的权限由文件创建掩码决定。用户每次注册进入系统时,umask命令都被执行, 并自动设置掩码mode来限制新文件的权限。用户可以通过再次执行umask命令来改变默认值,新的权限将会把旧的覆盖掉。

• 语法

在SQLite中查询距离已知坐标点最近的坐标_chmod 777命令_07

• 选项

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_08

• 参数

权限掩码:指定权限掩码。

• 实例

利用umask命令可以指定哪些权限将在新文件的默认权限中被删除。例如,可以使用下面的命令创建掩码,使得组用户的写权限,其他用户的读、写和执行权限都被取消:

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_09

执行该命令以后,对于下面创建的新文件,其文件主的权限未做任何改变,而组用户没有写权限,其他用户的所有权限都被取消。

应注意:操作符“=”在umask命令和chmod命令中的作用恰恰相反。在chmod命令中,利用它来设置指定的权限,而其余权限则被删除;但是在umask命令中,它将在原有权限的基础上删除指定的权限。

不能直接利用umask命令创建一个可执行的文件,用户只能在其后利用chmod命令使它具有执行权限。假设执行了命令umask u=, g=w, o=rwx,虽然在命令行中,没有删去文件主和组用户的执行权限,但默认的文件权限还是640(即 rw-r-----),而不是750(rwxr-x---)。但是,如果创建的是目录或者通过编译程序创建的一个可执行文件,将不受此限制。在这种情况 下,会设置文件的执行权限。

也可以使用八进制数值来设置mode。由于在umask中所指定的权限是要从文件中删除的,所以,如果该文件原来的初始化权限是777,那么执行命令umask 022以后,该文件的权限将变为755:如果该文件原来的初始化权限是666,那么该文件的权限将变为644。

可以使用下面的命令检查新创建文件的默认权限:

在SQLite中查询距离已知坐标点最近的坐标_chmod 777命令_10

选项-s表示以字符形式显示当前的掩码。如果直接输入umask命令,不带任何参数,那么将以八进制形式显示当前的掩码。系统默认的掩码是0022。

3.2chattr

chattr命令用来改变文件属性。这项指令可改变存放在ext2和ext3文件系统上的文件或目录属性,这些属性共有以下8种模式:

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_11

• 语法

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_12

• 选项

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_13

• 实例

用chattr命令防止系统中某个关键文件被修改:

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_14

然后试一下rm、mv、rename等命令操作于该文件,都是得到Operation not permitted的结果。

让某个文件只能往里面追加内容,不能删除,一些日志文件适用于这种操作:

在SQLite中查询距离已知坐标点最近的坐标_chmod 777命令_15

3.3 lsattr

lsattr命令用于查看文件的第二扩展文件系统属性。

• 语法

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_16

• 选项

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_17

lsattr经常使用的几个选项-D,-E,-R这三个选项不可以一起使用,它们是互斥的,经常使用的还有-l,-H,使用lsattr时,必须指出具体的设备名,用-l选项指出要显示设备的逻辑名称,否则要用-c,-s,-t等选项唯一的确定某个已存在的设备。

• 参数

文件:指定显示文件系统属性的文件名。

• 实例

在SQLite中查询距离已知坐标点最近的坐标_chmod 777命令_18

3.3file

file命令用来探测给定文件的类型。file命令对文件的检查分为文件系统、魔法幻数检查和语言检查3个过程。

• 语法

在SQLite中查询距离已知坐标点最近的坐标_chmod 777命令_19

• 选项

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_20

• 参数

文件:要确定类型的文件列表,多个文件之间使用空格分开,可以使用shell通配符匹配多个文件。

• 实例

显示文件类型

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_21

显示符号链接的文件类型

在SQLite中查询距离已知坐标点最近的坐标_chmod 777命令_22

4linux文件特殊权限(SUID、SGID、SBIT)

4.1Set UID

当s这个标志出现在文件所有者的x权限上时,如/usr/bin/passwd这个文件的权限状态:“-rwsr-xr-x.”,此时就被称为Set UID,简称为SUID。那么这个特殊权限的特殊性的作用是什么呢?主要是以下作用:

1、SUID权限仅对二进制程序(binary program)有效;

2、执行者对于该程序需要具有x的可执行权限;

3、本权限仅在执行该程序的过程中有效(run-time);

4、执行者将具有该程序拥有者(owner)的权限。

SUID的目的就是:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。passwd就是一个很鲜明的例子,下面我们就来了解一下这相passwd执行的过程。

统中的用户密码是保存在/etc/shadow中的,其实有没有r权限不重要,因为我们的root用户是拥有最高的权限,什么都能干了。关键是要把密码写入到/etc/shadow中。我们知道,除了root用户能修改密码外,用户自己同样也能修改密码,为什么没有写入权限,还能修 改密码,就是因为这个SUID功能。

下面就是passwd这个命令的执行过程:

1、因为/usr/bin/passwd的权限对任何的用户都是可以执行的,所以系统中每个用户都可以执行此命令。

2、而/usr/bin/passwd这个文件的权限是属于root的。

3、当某个用户执行/usr/bin/passwd命令的时候,就拥有了root的权限了。

4、于是某个用户就可以借助root用户的权力,来修改了/etc/shadow文件了。

5、最后,把密码修改成功。

这个SUID只能运行在二进制的程序上(系统中的一些命令),不能用在脚本上(script),因为脚本还是把很多的程序集合到一起来执行,而不是脚本自身在执行。同样,这个SUID也不能放到目录上,放上也是无效的。

4.2Set GID

我们前面讲过,当s这个标志出现在文件所有者的x权限上时,则就被称为Set UID。那么把这个s放到文件的所属用户组x位置上的话,就是SGID。如开头的/usr/bin/wall命令。那么SGID的功能是什么呢?和SUID一样,只是SGID是获得该程序所属用户组的权限。这相SGID有几点需要我们注意:

1、SGID对二进制程序有用;

2、程序执行者对于该程序来说,需具备x的权限;

3、SGID主要用在目录上;

理解了SUID,我想SGID也很容易理解。如果用户在此目录下具有w权限的话,若使用者在此目录下建立新文件,则新文件的群组与此目录的群组相同。

4.3Sticky Bit

这个就是针对others来设置的了,和上面两个一样,只是功能不同而已。SBIT(Sticky Bit)目前只针对目录有效,对于目录的作用是:当用户在该目录下建立文件或目录时,仅有自己与 root才有权力删除。

最具有代表的就是/tmp目录,任何人都可以在/tmp内增加、修改文件(因为权限全是rwx),但仅有该文件/目录建立者与 root能够删除自己的目录或文件。

注:这个SBIT对文件不起作用。

4.4SUID/SGID/SBIT权限设置

可参考链接内容: 。

5命令与文件的查询

5.1which

which命令用于查找并显示给定命令的绝对路径,环境变量PATH中保存了查找命令时需要遍历的目录。which指令会在环境变量$PATH设置的目录里查找符合条件的文件。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。

• 语法

在SQLite中查询距离已知坐标点最近的坐标_chmod 777命令_23

• 选项

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_24

• 参数

指令名:指令名列表。

• 实例

查找文件、显示命令路径:

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_25

说明:which是根据使用者所配置的 PATH 变量内的目录去搜寻可运行档的!所以,不同的PATH配置内容所找到的命令当然不一样的!

5.2whereis

whereis命令用来定位指令的二进制程序、源代码文件和man手册页等相关文件的路径。

whereis命令用来定位指令的二进制程序、源代码文件和man 手册页等相关文件的路径。

whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。

和find 相比,whereis查找的速度非常快,这是因为linux系统会将 系统内的所有文件都记录在一个数据库文件中,当使用whereis和下面即将介绍locate 时,会从数据库中查找数据,而不是像find命令那样,通 过遍历硬盘来查找,效率自然会很高。但是该数据库文件并不是实时更新,默认情况下时一星期更新一次,因此,我们在用whereis和locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。

• 语法

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_26

• 选项

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_27

• 参数

指令名:要查找的二进制程序、源文件和man手册页的指令名。

• 实例

将相关的文件都查找出来

在SQLite中查询距离已知坐标点最近的坐标_chmod 777命令_28

说明:tomcat没安装,找不出来,svn安装找出了很多相关文件

只将二进制文件查找出来 。

在SQLite中查询距离已知坐标点最近的坐标_chmod 777命令_29

说明:whereis -m svn查出说明文档路径,whereis -s svn找source源文件。

5.3 locate/socate

locate命令和slocate命令都用来查找文件或目录。

locate命令其实是find  -name的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/locatedb,这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb 命令,手动更新数据库。

• 语法

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_30

• 选项

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_31

• 参数

查找字符串:要查找的文件名中含有的字符串。

• 实例

搜索etc目录下所有以sh开头的文件:

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_32

搜索用户主目录下,所有以m开头的文件:

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_33

搜索用户主目录下,所有以m开头的文件,并且忽略大小写:

在SQLite中查询距离已知坐标点最近的坐标_chmod 777命令_34

5.4find

find命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。

• 语法

在SQLite中查询距离已知坐标点最近的坐标_chmod 777命令_35

• 选项

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_36

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_37

在SQLite中查询距离已知坐标点最近的坐标_chmod 777命令_38

• 参数

起始目录:查找文件的起始目录。

• 实例

(1) 根据文件或者正则表达式进行匹配

列出当前目录及子目录下所有文件和文件夹

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_39

在/home目录下查找以.txt结尾的文件名

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_40

同上,但忽略大小写

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_41

当前目录及子目录下查找所有以.txt和.pdf结尾的文件

在SQLite中查询距离已知坐标点最近的坐标_chmod 777命令_42

匹配文件路径或者文件

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_43

基于正则表达式匹配文件路径

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_44

同上,但忽略大小写

在SQLite中查询距离已知坐标点最近的坐标_chmod 777命令_45

(2)否定参数

找出/home下不是以.txt结尾的文件

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_46

(%1) 根据文件类型进行搜索

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_47

类型参数列表:f 普通文件、l 符号连接、d 目录、c 字符设备、b 块设备、s 套接、p Fifo。

(%1) 基于目录深度搜索

向下最大深度限制为3

在SQLite中查询距离已知坐标点最近的坐标_chmod 777命令_48

搜索出深度距离当前目录至少2个子目录的所有文件

在SQLite中查询距离已知坐标点最近的坐标_chmod 777命令_49

(%1) 根据时间戳进行搜索

在SQLite中查询距离已知坐标点最近的坐标_chmod 777命令_50

搜索最近七天内被访问过的所有文件

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_51

搜索超过七天内被访问过的所有文件

在SQLite中查询距离已知坐标点最近的坐标_chmod 777命令_52

搜索访问时间超过10分钟的所有文件

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_53

找出比file.log修改时间更长的所有文件

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_54

(%1) 根据文件大小进行匹配

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_55

文件大小单元:b —— 块(512字节)、c —— 字节、w —— 字(2字节)、k —— 千字节、M —— 兆字节、G —— 吉字节、搜索大于10KB的文件。

搜索大于10KB的文件

在SQLite中查询距离已知坐标点最近的坐标_chmod 777命令_56

搜索小于10KB的文件

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_57

搜索等于10KB的文件

在SQLite中查询距离已知坐标点最近的坐标_chmod 777命令_58

(%1) 删除匹配文件

删除当前目录下所有.txt文件

在SQLite中查询距离已知坐标点最近的坐标_chmod 777命令_59

(%1) 根据文件权限/所有权进行匹配

当前目录下搜索出权限为777的文件

在SQLite中查询距离已知坐标点最近的坐标_chmod 777命令_60

找出当前目录下权限不是644的php 文件

在SQLite中查询距离已知坐标点最近的坐标_chmod 777命令_61

找出当前目录用户tom拥有的所有文件

在SQLite中查询距离已知坐标点最近的坐标_chmod 777命令_62

找出当前目录用户组sunk拥有的所有文件

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_63

(%1) 借助-exec选项与其他命令结合使用

找出当前目录下所有root的文件,并把所有权更改为用户tom

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_64

上例中,{} 用于与-exec选项结合使用来匹配所有文件,然后会被替换为相应的文件名。

找出自己家目录下所有的.txt文件并删除

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_65

上例中,-ok和-exec行为一样,不过它会给出提示,是否执行相应的操作。

查找当前目录下所有.txt文件并把他们拼接起来写入到all.txt文件中

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_66

将30天前的.log文件移动到old目录中

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_67

找出当前目录下所有.txt文件并以“File:文件名”的形式打印出来

在SQLite中查询距离已知坐标点最近的坐标_chmod 777命令_68

因为单行命令中-exec参数中无法使用多个命令,以下方法可以实现在-exec之后接受多条命令

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_69

(%1) 搜索但跳出指定的目录

查找当前目录或者子目录下所有.txt文件,但是跳过子目录sk

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_70

(%1) 其他技巧

要列出所有长度为零的文件

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_71

5.5hexdump

hexdump命令一般用来查看“二进制”文件的十六进制编码,但实际上它能查看任何文件,而不只限于二进制文件。

• 语法

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_72

• 选项

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_73

每个格式字符串由三部分组成,每个由空格分隔,第一个形如a/b,b表示对每b个输入字节应用format1格式,a表示对每a个输入字节应用format2格式,一般a>b,且b只能为1,2,4,另外a可以省略,省略则a=1。format1和format2中可以使用类似print的格式字符串,如:

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_74

还有一些特殊的用法:

在SQLite中查询距离已知坐标点最近的坐标_chmod 777命令_75

同一行如果要显示多个格式字符串,则可以跟多个-e选项。

• 实例

在SQLite中查询距离已知坐标点最近的坐标_文件最后一次被修改的时间_76


往期回顾

1.每日学习:数字IC设计前后端学习资料推荐与下载

2.每日学习:Linux文件与目录管理常用命令解析

3.每日学习:在布局布线后对版图进行DRC有何意义呢?

4.每日学习:Linux改变文件属性与权限常用的三个命令

5.每日学习:机器学习在IC设计中的应用(一)--利用率可达99%的神技--Placement及Relative Placement

6.每日学习:机器学习在IC设计中的应用(二)--根据GBA时序结果来预测PBA

7.每日学习:机器学习在IC设计中的应用(四)-- 预测DRC

8.每日学习:数字IC设计EDA软件教程整理

9.每日学习:Linux的起源、发展和一些学习体会

10.每日学习:记忆深处有尘埃——Memory Compiler

特别鸣谢摩尔精英的支持