频道栏目
首页 > 资讯 > Linux > 正文

Linux的文件与目录管理学习

18-07-02        来源:[db:作者]  
收藏   我要投稿

1. 几个特殊目录

.:此层目录

..:上一层目录

-:前一个工作目录

~:当前用户的家目录

~account:account用户的家目录

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

一般文件系统的顶层目录(如本例中的/、/boot、/home)的inode编号从2开始,几个编号为1的目录都是虚拟文件系统的顶层目录

所谓的顶层目录,实际上就是文件系统在目录树中的挂载点

2. PATH环境变量

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

2)不同用户的PATH环境变量值是不同的,所以能随意执行的命令也不同。

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)

示例:

3)mkdir命令

命令名称:mkdir

命令英文原意:make directories

命令所在路径:/bin/mkdir

执行权限:所有用户

功能描述:创建新目录

语法:mkdir [-pm] 目录名

-p:递归创建,一并创建路径中尚未创建的目录,如果目录已存在不报错

-m:创建目录的同时指定权限,无视默认权限(umask)

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 选项作用

6)cp命令

命令名称:cp

命令英文原意:copy

命令所在路径:/bin/cp

执行权限:所有用户

功能描述:复制文件或目录

语法:cp [-rpdu] 源文件或目录 目标目录

-r:递归,复制目录时必须使用

-p:复制时保留文件属性(常用于备份)

-d:若源文件为软链接文件,则复制链接文件属性而非文件本身

-u:只有目标比源旧时才复制(update)

-a:相当于-pdr

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

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

说明1:-p 选项的作用

可见,当没有使用-p 选项时,由于复制文件相当于在目标目录中新建文件,所以文件的最后修改时间就改变了。

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

可见使用-p选项后保留了原先的用户组信息,但是只有root用户有此功能,普通用户即使使用-p 选项也无法保留文件所有者和所属组

普通用户使用-p 选项可以保持时间不变,但用户和用户组均改为cp命令执行者及其缺省组

为什么会这样呢?其实从root环境的例子中就可以找到答案,我们观察复制后文件的inode编号

一定要注意,复制后的文件是一个独立的文件,root用户使用-p的做法相当于给utmp用户组增加了一个文件,但普通用户是没有这个权利的

说明2:-d选项的作用

假设hello_soft是hello的软链接文件

下面测试-d 选项的作用

说明3:使用cp复制文件需要有文件的读权限(当然仅是针对普通用户而言)

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

7)rm命令

命令名称:rm

命令英文原意:remove

命令所在路径:/bin/rm

执行权限:所有用户

功能描述:删除文件或目录

语法:rm [-rf] 文件或目录

-r:递归,删除目录时必须使用

-f:强制执行

注意:root用户使用的rm实际上是rm -i的别名,所以删除文件时默认会有提示

8)mv命令

命令名称:mv

命令英文原意:move

命令所在路径:/bin/mv

执行权限:所有用户

功能描述:剪切文件、改名

语法:mv 源文件或目录 目标目录

注:也可以使用rename命令给文件更名,而且可以实现批量更改

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

注意2:root用户的mv命令也是别名

9)touch命令

命令名称:touch

命令所在路径:/bin/touch

执行权限:所有用户

功能描述:创建空文件,更新文件的时间戳

语法:touch 文件名

说明:关于更新文件时间戳

只有文件是所有者和root可以修改文件的时间戳

经上机验证,普通用户如果是文件所有者,即使没有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:取得目录名

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为例

可见显示后并没有退出,而是挂起等待,下面用SecureCRT远程登录,然后设置一下虚拟IP

这些操作就会反应到日志文件中。该功能一般用于动态监视日志文件。

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次幂

注:如果不用-t 选择指定,默认是以-t o2显示文件内容

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

1)概述

这三种特殊权限都是针对文件的执行(x)权限,通过替换user、group和other的x权限位实现不同的功能

说明:s 与t 这两个权限的意义与系统的账号及系统的进程有关

2)SUID(Set UID)

定义:s 出现在文件所有者的x 权限上

功能:

① 只有可执行的二进制程序才能设定SUID权限

② 命令的执行者要对该程序有x 权限

③ 命令执行者在执行该程序时获得该程序文件属主的身份

④ SUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效。

示例:passwd命令

普通用户可以通过passwd命令修改自己的密码,而对密码的修改就体现在对/etc/shadow文件的修改,我们来看一下这个文件的权限

也就是说,只有root用户可以读写这个文件(因为rwx权限是不能限制root用户的)

下面再看一下passwd命令的权限

可见passwd命令设置了SUID,所以普通用户在执行passwd命令时获得了passwd命令属主,即root用户的身份,因而可以修改/etc/passwd文件

特别注意: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后才有

可见普通用户并不能访问这个数据库文件,下面再来看看locate命令的权限

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

SGID对目录的作用:

① 普通用户必须对此目录拥有r 和x 权限,才能进入此目录

② 普通用户在此目录中的有效组会变成此目录的属组

③ 若普通用户对此目录拥有w 权限,新建文件的默认属组是这个目录的属组

注意:如果没有SGID,新建文件的属组应该是命令执行者的缺省组

说明:有效组的查看

可以使用id命令查看当前有效组

id:print real and effective user and group IDs

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

4)SBIT(Sticky Bit)

定义:t 出现在文件其他用户的x 权限上

功能:

① SBIT目前只对目录有效

② 普通用户对该目录拥有w 和x 权限,即普通用户可以在此目录拥有写入权限

③ 如果没有SBIT,因为普通用户拥有w 权限,所以可以删除此目录下的所有文件,包括其他用户建立的文件。一旦赋予了SBIT,除了root可以删除所有文件,普通用户就算拥有w 权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件

示例:/tmp目录

所以任何人都可以在/tmp内添加、修改文件,但仅有该文件/目录的属主和root能删除。

5)如何设置特殊权限位

chmod xugo 文件/目录

其中ugo即通常的rwx权限位,x 为特殊权限位

4:SUID

2:SGID

1:SBIT

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

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路径中所有匹配项,而不只是第一个

说明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:只查找源文件

说明1:whereis是搜索文件数据库,不是搜索硬盘

说明2:wheris也需要完整的文件名,不能使用通配符。

2)文件搜索类

A. locate命令

命令名称:locate

命令所在路径:/usr/bin/locate

执行权限:所有用户

功能描述:在文件资料库中查找文件

语法:locate [-i] 文件名

-i:忽略大小写

注意:locate PATTERN的行为相当于查找文件名为*PATTERN*的文件,所以加入通配符反而有问题

说明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的效果

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

此处的^# 就是指开头的井号

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 权限

相关TAG标签
上一篇:关于c#的多态性学习
下一篇:Linux文件权限与目录配置等基础知识讲解
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站