04. Linux文件与目录管理

1. 几个特殊目录

.:此层目录
..:上一层目录
-:前一个工作目录
~:当前用户的家目录
~account:account用户的家目录

说明:每个目录下都有. 和..目录,即使是根目录/ 下也有,只不过他们代表同一个目录(可以发现根目录下的. 和.. 目录的inode编号相同,为同一个目录)
04. Linux文件与目录管理

一般文件系统的顶层目录(如本例中的/、/boot、/home)的inode编号从2开始,几个编号为1的目录都是虚拟文件系统的顶层目录
所谓的顶层目录,实际上就是文件系统在目录树中的挂载点

2. PATH环境变量

1)在任何地方都可以执行PATH环境变量中所包含目录中的命令

2)不同用户的PATH环境变量值是不同的,所以能随意执行的命令也不同。
04. Linux文件与目录管理
3)假设2个ls命令在不同的目录中,如/usr/local/bin/ls和/bin/ls,那么执行ls时,PATH中哪个目录先被搜索就执行哪个。

4)PATH环境变量可以修改
① shell中使用export PATH=$PATH:要加入的目录,实现临时修改
② 在脚本中修改(~/.bashrc等),实现永久修改

注意:出于安全因素考虑,最好不要将当前目录(.)加入PATH变量

3. 目录与文件相关命令

1)cd命令

命令名称:cd
命令英文原意:change directory
命令所在路径:shell内建命令
执行权限:所有用户
功能描述:切换工作目录
语法:cd [目录]
注:cd后不加任何内容是进入当前用户的家目录

2)pwd命令

命令名称:pwd
命令英文原意:print working directory
命令所在路径:/bin/pwd
执行权限:所有用户
功能描述:显示当前目录
语法:pwd [-P]
-P:如果当前目录是软连接,则显示其指向的目录(avoid all symlinks)
示例:
04. Linux文件与目录管理

04. Linux文件与目录管理

3)mkdir命令

命令名称:mkdir
命令英文原意:make directories
命令所在路径:/bin/mkdir
执行权限:所有用户
功能描述:创建新目录
语法:mkdir [-pm] 目录名
-p:递归创建,一并创建路径中尚未创建的目录,如果目录已存在不报错
-m:创建目录的同时指定权限,无视默认权限(umask)

04. Linux文件与目录管理

4)rmdir命令

命令名称:rmdir
命令英文原意:remove empty directories
命令所在路径:/bin/rmdir
执行权限:所有用户
功能描述:删除空目录
语法:rmdir [-p] 目录名
-p:连同上层的空目录一并删除

5)ls命令

命令名称:ls
命令所在路径:/bin/ls
执行权限:所有用户
功能描述:显示目录文件
语法:ls [-aldhiR] [文件或目录]
-a:显示所有文件,包括隐藏文件
-l:详细信息显示
-d:查看目录属性
-h:人性化显示
-i:显示inode编号
-R:连同子目录内容一并显示,即显示目录下的所有文件
说明:-d 选项作用
04. Linux文件与目录管理

6)cp命令

命令名称:cp
命令英文原意:copy
命令所在路径:/bin/cp
执行权限:所有用户
功能描述:复制文件或目录
语法:cp [-rpdu] 源文件或目录 目标目录
-r:递归,复制目录时必须使用
-p:复制时保留文件属性(常用于备份)
-d:若源文件为软链接文件,则复制链接文件属性而非文件本身
-u:只有目标比源旧时才复制(update)
-a:相当于-pdr

注意:理解cp命令的关键是cp的目标文件是新建一个文件,因此会使用新的inode和block,自然也就有了拷贝中的权限属性问题。
04. Linux文件与目录管理

所谓权限属性问题,即如果在拷贝中不加限制,目标文件的属性将会是用户新建文件的默认属性(这些属性包括文件所有者、所属组、权限、时间等)。
04. Linux文件与目录管理

说明1:-p 选项的作用
04. Linux文件与目录管理
可见,当没有使用-p 选项时,由于复制文件相当于在目标目录中新建文件,所以文件的最后修改时间就改变了。

在默认条件下,cp的源文件与目的文件的权限不同,目的文件的所有者通常是命令操作者本身(即新建文件时的默认所有者和所属组),此时也可以使用-p选项保留原用户和原用户组

04. Linux文件与目录管理
可见使用-p选项后保留了原先的用户组信息,但是只有root用户有此功能,普通用户即使使用-p 选项也无法保留文件所有者和所属组
04. Linux文件与目录管理
普通用户使用-p 选项可以保持时间不变,但用户和用户组均改为cp命令执行者及其缺省组

为什么会这样呢?其实从root环境的例子中就可以找到答案,我们观察复制后文件的inode编号
04. Linux文件与目录管理
一定要注意,复制后的文件是一个独立的文件,root用户使用-p的做法相当于给utmp用户组增加了一个文件,但普通用户是没有这个权利的

说明2:-d选项的作用
假设hello_soft是hello的软链接文件
04. Linux文件与目录管理

下面测试-d 选项的作用
04. Linux文件与目录管理

说明3:使用cp复制文件需要有文件的读权限(当然仅是针对普通用户而言)
04. Linux文件与目录管理

说明4:cp 命令还可以进行硬链接[-l]和软链接[-s],但我个人强烈反对这种非主流的用法

7)rm命令

命令名称:rm
命令英文原意:remove
命令所在路径:/bin/rm
执行权限:所有用户
功能描述:删除文件或目录
语法:rm [-rf] 文件或目录
-r:递归,删除目录时必须使用
-f:强制执行
注意:root用户使用的rm实际上是rm -i的别名,所以删除文件时默认会有提示
04. Linux文件与目录管理

8)mv命令

命令名称:mv
命令英文原意:move
命令所在路径:/bin/mv
执行权限:所有用户
功能描述:剪切文件、改名
语法:mv 源文件或目录 目标目录
注:也可以使用rename命令给文件更名,而且可以实现批量更改

注意1:剪切并不会新建文件,只是修改目录文件block中文件名与inode的对应关系
04. Linux文件与目录管理

注意2:root用户的mv命令也是别名
04. Linux文件与目录管理

9)touch命令

命令名称:touch
命令所在路径:/bin/touch
执行权限:所有用户
功能描述:创建空文件,更新文件的时间戳
语法:touch 文件名
说明:关于更新文件时间戳
04. Linux文件与目录管理

只有文件是所有者和root可以修改文件的时间戳
04. Linux文件与目录管理
经上机验证,普通用户如果是文件所有者,即使没有r、w、x权限依然可以使用touch修改时间戳。这是因为时间戳记录在文件对应的inode中而不是文件本身的内容,而所谓文件的权限是针对文件内容的。

Linux中文件的三个时间:
① modification time(mtime)
当文件的“内容数据”更改时(block被修改),就会更新这个时间,ls默认显示的时间就是mtime。

② status time(ctime, change time)
当文件的“状态”改变时(inode被修改),就会更新这个时间,比如权限属性被更改。
③ access time(atime)
当“该文件的内容被取用”时,就会更新这个时间,比如使用cat去显示文件的内容

touch命令更新的是atime和mtime(update the access and modification times of each file to the current time)

10)取得文件名与目录名

basename:取得文件名
dirname:取得目录名

04. Linux文件与目录管理

11)file命令

命令名称:file
命令所在路径:/usr/bin/file
执行权限:所有用户
功能描述:查看文件类型
语法:file 文件名

4. 文件内容查阅命令

1)cat命令

命令名称:cat
命令所在路径:/bin/cat
执行权限:所有用户
功能描述:显示文件内容;连接文件并显示在标准输出上
语法:cat [-n] 文件名
-n:显示行号,连空白行也有行号

2)tac命令

命令名称:tac
命令所在路径:/usr/bin/tac
执行权限:所有用户
功能描述:反向显示文件内容
语法:tac 文件名
注意:tac是没有-n选项的~~

3)more命令

命令名称:more
命令所在路径:/bin/more
执行权限:所有用户
功能描述:分页显示文件内容
语法:more 文件名
相关操作:
[空格]或[f]:向下翻页
[Enter]:换行
[b]:向上翻页 //原来只有less可以
q或Q:退出
但more中不能查找(准确说是不能标亮)

4)less命令

命令名称:less
命令所在路径:/usr/bin/less
执行权限:所有用户
功能描述:分页显示内容,可向上翻页(可以使用PgUp、PgDn和上下箭头),也可以查找
语法:less 文件名

5)head命令

命令名称:head
命令所在路径:/usr/bin/head
执行权限:所有用户
功能描述:显示文件前面几行
语法:head [-n] 文件名 //head -n 5 filename
-n:指定显示的行数,默认为10行
说明:head -n -100 filename
-n 后的参数为负数:除了最后的100行不显示,其余均显示出来

6)tail命令

命令名称:tail
命令所在路径:/usr/bin/tail
执行权限:所有用户
功能描述:显示文件后面几行
语法:tail [-nf] 文件名
-n:指定显示的行数,默认为10行
-f:动态显示文件末尾内容

说明1:tail -n +100 filename
从100行开始,显示到最后(-n +K,to output lines starting with the Kth)
说明2:-f 选项的作用
以日志文件/var/log/message为例
04. Linux文件与目录管理
可见显示后并没有退出,而是挂起等待,下面用SecureCRT远程登录,然后设置一下虚拟IP
04. Linux文件与目录管理
这些操作就会反应到日志文件中。该功能一般用于动态监视日志文件。

7)od命令

命令名称:od
命令所在路径:/usr/bin/od
执行权限:所有用户
功能描述:使用八\十六进制或其他格式显示文件,一般用于显示非文本文件
语法:od [-t TYPE] [文件名] //此处可以省略文件名,此时从stdin得到输入内容
-t c:以ASCII字符输出
-t d[size]:利用十进制输出,每个整数占用size个字节
-t o[size]:利用八进制输出,每个整数占用size个字节
-t x[size]:利用十六进制输出,每个整数占用size个字节
注意:size只能是2的n次幂

04. Linux文件与目录管理
注:如果不用-t 选择指定,默认是以-t o2显示文件内容

5. 文件特殊权限:SUID、SGID、SBIT

1)概述

这三种特殊权限都是针对文件的执行(x)权限,通过替换user、group和other的x权限位实现不同的功能
04. Linux文件与目录管理
说明:s 与t 这两个权限的意义与系统的账号及系统的进程有关

2)SUID(Set UID)

定义:s 出现在文件所有者的x 权限上
功能:
只有可执行的二进制程序才能设定SUID权限
② 命令的执行者要对该程序有x 权限
③ 命令执行者在执行该程序时获得该程序文件属主的身份
④ SUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效。

示例:passwd命令
普通用户可以通过passwd命令修改自己的密码,而对密码的修改就体现在对/etc/shadow文件的修改,我们来看一下这个文件的权限
04. Linux文件与目录管理
也就是说,只有root用户可以读写这个文件(因为rwx权限是不能限制root用户的)

下面再看一下passwd命令的权限
04. Linux文件与目录管理
可见passwd命令设置了SUID,所以普通用户在执行passwd命令时获得了passwd命令属主,即root用户的身份,因而可以修改/etc/passwd文件
04. Linux文件与目录管理
特别注意:SUID的设置是非常危险的,假设vim被设置了SUID,那么所有能运行vim的用户都可以借由vim这个软件修改系统文件。因此在Linux中将这类文件标为红色,以示危险。

3)SGID(Set GID)

定义:s 出现在文件所属组的x 权限上
SGID对文件的作用:
① 只有可执行的二进制程序能设置SGID权限
② 命令执行者要对该程序拥有x权限
③ 命令执行者在执行程序时,组身份提升为该程序文件的属组
④ SGID权限同样只在该程序执行过程中有效,也就是说组身份的改变只在程序执行过程中有效
SGID对文件作用示例:locate命令
locate命令在执行过程中要查询/var/lib/mlocate/mlocate.db,我们来看看这个数据库的权限
注意:这个数据库原先没有,在执行了updatedb后才有
04. Linux文件与目录管理
可见普通用户并不能访问这个数据库文件,下面再来看看locate命令的权限

04. Linux文件与目录管理
可见该命令设置的SGID,所以普通用户在运行locate命令时,组身份变为slocate,因此可以读取mlocate.db数据库

SGID对目录的作用:
① 普通用户必须对此目录拥有r 和x 权限,才能进入此目录
② 普通用户在此目录中的有效组会变成此目录的属组
③ 若普通用户对此目录拥有w 权限,新建文件的默认属组是这个目录的属组
注意:如果没有SGID,新建文件的属组应该是命令执行者的缺省组

说明:有效组的查看
可以使用id命令查看当前有效组
id:print real and effective user and group IDs
04. Linux文件与目录管理

但是根据实验,在设置SGID的目录中,使用id打印出的有效组依然为500。但创建文件的所属组确实更改为该目录的所属组
04. Linux文件与目录管理

4)SBIT(Sticky Bit)

定义:t 出现在文件其他用户的x 权限上
功能:
① SBIT目前只对目录有效
② 普通用户对该目录拥有w 和x 权限,即普通用户可以在此目录拥有写入权限
③ 如果没有SBIT,因为普通用户拥有w 权限,所以可以删除此目录下的所有文件,包括其他用户建立的文件。一旦赋予了SBIT,除了root可以删除所有文件,普通用户就算拥有w 权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件

示例:/tmp目录
04. Linux文件与目录管理
所以任何人都可以在/tmp内添加、修改文件,但仅有该文件/目录的属主和root能删除。

5)如何设置特殊权限位

chmod xugo 文件/目录
其中ugo即通常的rwx权限位,x 为特殊权限位
4:SUID
2:SGID
1:SBIT

注意:由于这三种特殊权限都是针对x 权限的,如果文件本身不具备x 权限,设置后将是S、T,表示空,即没有相应权限
04. Linux文件与目录管理

6. 文件隐藏属性

1)chattr命令

命令名称:chattr
命令所在路径:/nur/bin/chattr
执行权限:所有用户
功能描述:修改文件/目录的隐藏属性
语法:chattr [+-=] [隐藏属性选项] 文件或目录名
+:增加权限
-:删除权限
=:等于某权限

常使用的2种隐藏属性:
i 属性:
对文件:不允许对文件进行删除、改名,也不能添加和修改数据。
对目录:首先该目录本身不能删除、改名。由于目录文件中记录的是文件名与inode编号的对应关系,所谓添加、修改目录文件的数据就是修改目录下的目录项。所以添加了i 属性后,只能修改目录下文件的数据,但不能建立和删除目录下的内容。

a 属性:
对文件:只能在文件中添加数据,但不能删除、修改数据。
对目录:只允许在目录中建立项目,但不允许删除项目。

说明:
A. 与一般rwx权限相比,chattr设置的隐藏权限对root用户也生效,但rwx不能。
B. chattr设置的隐藏权限仅对ext2/ext3文件系统有效
C. i 属性和a 属性只能由root设置(已上机验证)
D. 文件设置a 属性后,是不能用文本编辑器(如vim)来编辑的,即使我们只是添加内容,因为系统无法判断你只是追加内容。可以使用echo xxx >> 文件的方式来追加内容。(从应用编程的角度说,只能以追加的方式打开文件)
E. 这2种隐藏属性都是保护系统重要文件免遭误删除,是实现系统安全的一种手段。

2)lsattr命令

命令名称:lsattr
命令所在路径:/usr/bin/ln
执行权限:所有用户
功能描述:查看文件/目录的隐藏属性
语法:lsattr [-adR] 文件/目录名
-a:显示所有文件和目录,包括隐藏文件
-d:若目标是目录,仅列出目录本身的属性,而不是目录中文件的属性
-R:连同子目录的内容全显示出来

7. 文件查找类命令

1)命令搜索类

A. which命令

命令名称:which
命令所在路径:/usr/bin/lwhich
执行权限:所有用户
功能描述:搜索命令所在路径及别名信息(show the full path of (shell) command)
语法:which [-a] 命令
-a:列出PATH路径中所有匹配项,而不只是第一个

04. Linux文件与目录管理
说明1:which命令是根据PATH环境变量中的路径去查找可执行文件
说明2:which后面必须跟完整的文件名,不能用通配符
说明3:which命令自然查找不到shell内置的命令

B. whereis命令

命令名称:whereis
命令所在路径:/usr/bin/whereis
执行权限:所有用户
功能描述:搜索命令所在目录及帮助文档路径(locate the binary, source, and manual page file for a command)
语法:whereis [-bms] 命令名称
-b:只查找二进制文件
-m:只查找manual路径下的文件
-s:只查找源文件

04. Linux文件与目录管理
说明1:whereis是搜索文件数据库,不是搜索硬盘
说明2:wheris也需要完整的文件名,不能使用通配符

2)文件搜索类

A. locate命令

命令名称:locate
命令所在路径:/usr/bin/locate
执行权限:所有用户
功能描述:在文件资料库中查找文件
语法:locate [-i] 文件名
-i:忽略大小写

注意:locate PATTERN的行为相当于查找文件名为*PATTERN*的文件,所以加入通配符反而有问题
04. Linux文件与目录管理

说明1:locate命令是在/var/lib/mlocate数据库中搜索文件。
使用数据库的优点:搜索速度快
使用数据库的缺点:
① 由于数据库不是实时更新,所以会找到已删除的文件,或新创建的文件找不到
② 文件数据库有搜索范围,所以有些目录(比如/tmp目录)中的文件不会被搜索到

如何更新mlocate数据库:使用updatedb命令,该命令会根据/etc/updatedb.conf的设置去查找系统硬盘内的文件名并更新/var/lib/mlocate数据库

说明2:locate命令不能使用通配符,但关键字可以是要查找文件名的一部分(上文已有解释)

B. find命令

命令名称:find
命令所在路径:/bin/find
执行权限:所有用户
功能描述:文件搜索(搜索硬盘、最强大、最复杂)
语法:find [搜索范围(可以接多个目录)] [匹配条件]
说明:find命令可以使用通配符

下面是对匹配条件的说明:
① 匹配条件
a. 文件名
find /etc -name init //可以使用*init* init*等等
find /etc -iname init //不区分大小写

b. 文件大小
find / -size +204800
+n:大于n
-n:小于n
n: 等于n
注意:find按文件大小搜索时,以数据块为单位,即以512B(0.5KB)为单位。所以+204800就是搜索大于100MB的文件
也可以使用c(代表byte)或k(代表1024 byte)来指定文件大小(e.g. -size +50k)

c. 文件所有者或所属组
find / -user chencheng
find / -group chencheng

说明1:也可以使用-uid-gid查找
说明2:-nouser和-nogroup分别用于查找文件所有者不在/etc/passwd文件中或文件所属组不在/etc/group文件中的文件

d. 时间
-amin -cmin -mmin:以分钟为单位
-atime -ctime -mtime:以天(24小时)为单位

下图显示的就是使用-mtime +4 -mtime -4 -mtime 4的效果
04. Linux文件与目录管理

e. 文件权限
-perm mode:文件权限 = mode
-perm -mode:文件权限至少 = mode(必须全部包含mode的权限)
-perm +mode:文件权限包含任一mode权限

f. 文件类型
-type f 文件
-type d 目录
-type l 软链接

g. inode节点编号
-inum

说明:-inum查找的2个应用场景
· 删除文件名诡异的文件,此时可以根据inode号删除
find ./ -inum xxx -exec rm {} \;

· 查看一个文件是否有硬链接,在文件所在分区按inode编号搜索即可(因为硬链接不能跨分区)
find ./ -inum xxx

② 连接选项
a. 逻辑连接
-a:2个匹配条件同时满足
-o:2个匹配条件满足任一即可
比如查找80~100MB的文件
find /etc -size +163840 -a -size -204800
b. find后执行命令
find / -name inittab -exec ls -l {} \; //{}和\;之间的空格必须有
说明:
-exec到\; 标识了额外命令的开始和结束
{}表示find命令的执行结果
可以使用-ok代替-exec,区别在于-ok执行额外命令时,每次都要询问是否执行
注意:使用-exec执行额外命令不支持命令别名,所以只能用ls -l 而不能使用ll

3)文件内容搜索类

命令名称:grep
命令所在路径:/bin/grep
执行权限:所有用户
功能描述:在文件中搜索与给定字符串匹配的行并输出
语法:grep [-ivnr] 指定字符串 文件
-i:不区分大小写
-v:排除指定字符串,输出剩余内容
-n:输出匹配行的行号
-r:递归查找给定目录下的所有文件,此时命令对象可以是目录

示例1:grep -n mysql /root/install.log
示例2:不显示脚本中的注释(此处指去掉以#开头的行)
grep -v ^# /etc/inittab
04. Linux文件与目录管理
此处的^# 就是指开头的井号

8. 权限与命令执行的关系

1)让用户可以进入某目录成为工作目录的基本权限
可使用的命令:cd
目录所需权限:用户对这个目录至少需要具有x 权限
额外需求:如果用户想在这个目录内利用ls 查阅文件名,则还需对此目录拥有r 权限
注意:由于目录时由根目录一层一层衍生出来的,所以要进入最终了目录需要对路径中的各级目录拥有x 权限
2)用户在某个目录内读取文件的基本权限
可使用的命令:cat、more、less等
目录所需权限:用户对这个目录至少需要具有x 权限
文件所需权限:用户对此文件至少需要具有r 权限
3)让用户可以修改一个文件的基本权限
可使用的命令:vi 等编辑器
目录所需权限:用户对这个目录至少需要具有x 权限
文件所需权限:用户对此文件至少需要具有r、w权限
特别注意:2)、3)两种情况均不需要对目录有r 权限,已上机验证
4)让一个用户可以创建/删除一个文件的基本权限
目录所需权限:用户对这个目录要具有w、x 权限
特别注意:经上机验证,这两个操作都必须对目录有x 权限
5)让用户进入某目录并执行该目录下的某个命令的基本权限
目录所需权限:用户对这个目录至少需要具有x 权限
文件所需权限:用户对该文件至少需要具有x 权限