文件和目录管理(四)

4文件和目录管理

4.1文件的基本操作

-------------------------------------------------------------------------------

4.1.1 绝对路径和相对路径

举个例子,把系统中的一个文件比喻成人来说吧。我是一个美团送货员。客户住在凯华丽景,一栋,三单元,11楼,4号。这个凯华丽景一栋三单元十一楼四号就是一个绝对路径,客户把这个地址给我我就能找到她。

当我走进凯华丽景一栋一单元后我搞忘客户在哪层楼了,于是我打电话问她,我在一栋三单元,搞忘你在几层了?这时候她一定会告诉你,十一楼4号,绝对不会告诉你我在凯华丽景一栋三单元十一楼四号,因为我本身就在一栋三单元了,她不用告诉我他的绝对路径,只需要告诉我相对路径即可,相对路径是相对我所在的位置。


绝对路径:从更目录开始写起的,/etc/sysconfig/network-scripts/ifcfg-ens33

相对路径:不是由根目录写起的,例如我本身就在/etc/sysconfig/network-scripts/目录下,我只需要写ifcfg-enss33就可以找到这个文件了


4.1.2 变更用户所在的目录

#cd /etc              进入到/etc目录中

#cd                    进入到用户的家目录中

#cd ..                返回上一级目录

#cd .                进入当前目录

#pwd                查看当前用户所在的目录

4.1.3 创建目录

mkdir [-p] /a/b/c

如果创建单个目录就不用加-p参数,如果创建批量的层级目录就要加上-p

4.1.4 删除目录或文件

rm [-rf] 文件

-r 代表删除目录,

-f 表示强制删除,他不会给你提示信息,因此用此命令删除一定不要带/,否则会把系统文件全部删掉。这是非常危险的。


4.2环境变量PATH

--------------------------------------------------------------------------------------

什么是环境变量呢?环境变量和我们使用的指令和程序是息息相关的。首先我们来看下我们平时候使用的指令的位置:


#which rm                    查看指令所在的绝对路径

文件和目录管理(四)

我们看到这个rm的路径,跟当前用户所在的路径不是一个路径,为啥我写rm就能找到rm呢?

这是环境变量的作用。

#echo $PATH

文件和目录管理(四)

echo使用来输出$PATH的值的,PATH前面的$是变量的前缀符号。

rm是在/usr/bin中定义的,而这个路径又在PATH中声明了,当我们写rm的时候系统回去环境变量所在目录中去找

那么我把rm移动到/root不就可以使用rm了吗?实际不行,因为你所在的目录不在$PATH中定义,除非你写绝对路径,/root/rm,或者除非rm移动到你当前用户所在的同级目录里。

我们一般不这样做。就使用系统默认的位置



4.2.1 拷贝文件

cp [选项] [来源文件] [目的文件]

-r 如果是一个目录就必须加-r 

-i是一个安全选项,如果遇到一个已经存在的文件会询问是否覆盖

在红帽系列中,cp其实就是cp -i

#which cp

文件和目录管理(四)


4.2.2 移动文件(剪切)

mv [选项] [源文件或目录] [目标文件或目录]


4.3 文档相关命令

---------------------------------------------------------------------------------------

cat 或 tac: 一个是正序显示,一个是倒叙显示

more  空格看下一页

less 导航键上下看,空格翻页

head 显示文件前十行

tail显示文件后十行,加上参数-f可以动态看文件

4.4 文件的所有者和所有组

--------------------------------------------------------------------------

文件和目录管理(四)

文件或者目录都有所有者和所有组,即这个文件属于哪个用户,这个文件属于哪个用户组

4.5 Linux文件属性

--------------------------------------------------------------------------------------

drwxr-x---.  3 root root     24 6月  17 07:32 dhcp

-rw-r--r--.  1 root root   5.0K 11月  5 2016 DIR_COLORS

“drwxr-x---”这个东西就是文件的属性,

第一个代表文件类型:

        d是目录,

        -表示普通文件,

        b表示块设备文件,

        c表示串行端口设备文件(又称字符设备文件),

            如键盘,鼠标,打印机,tty终端都是这样的而文件,

        s表示套接字文件(socket),

后面每三个为一组,r代表此文件可读,w表示可写,x表示可执行

    第一组代表所有者的权限

    第二组代表所有组的权限

    第三组代表其他人的权限

    


文件和目录管理(四)

红框内代表文件的所有者和所有组,


4.6 更改文件的权限

------------------------------------------------------------------------------------

4.6.1 更改文件所有组

change group 

chgrp [参数选项] [组名] [文件名]

案例:

# groupadd sosGroup  //新建一个组
# mkdir test                    //创建一个文件夹
# cd test                            
# touch a.txt                //创建一个文件
# ls -l                            //查看文件属性,用户组是属于root组
总用量 0
-rw-r--r--. 1 root root 0 6月  17 16:49 a.txt
# chgrp sosGroup a.txt            //修改用户组
# ls -l                                        //查看文件属性,用户组变成了sosGroup
总用量 0

-rw-r--r--. 1 root sosGroup 0 6月  17 16:49 a.txt


上面我修改的是文件,如果我修改的是目录,是不能修改到目录里的文件的,如果要修改一个目录以及它肚子里的仔那么要加上级联修改的参数

    #chgrp -R sosGroup 目录

4.6.2 更改文件所有者

change owner

chown [-R级联参数] 账户名 文件名

或者

chown [-R]  账户名:组名 文件名

示例命令:

# mkdir d3                        //创建目录d3
# useradd user1                //创建用户user1
# touch d3/a.txt                //创建d3下的文件a.txt
# chown user1 d3            //修改目录的所有者
# ls -l
总用量 0
drwxr-xr-x. 2 user1 root 19 6月  17 17:07 d3
[[email protected] linux测试]# cd d3        
[[email protected] d3]# ls -l              //d3肚子里的孩子并没有被修改所有者
总用量 0

-rw-r--r--. 1 root root 0 6月  17 17:07 a.txt


如果要目录中的文件随着目录一同被修改就是用参数-R


4.6.3 更改文件的权限

change mode

linux使用数字代表文件的权限:

        r=4

        w=2

        x=1

        -=0

        rwxrwx---算下来就等于770

        rwx=4+2+1,rwx=4+2+1,---=0+0+0



chmod [-R] xyz 文件名

这里的xyz代表的是数字

例如:

chmod -R 750 文件名

就像文件赋予了 rwx r-x ---

4.6.4 文件的默认权限

我们创建一个文件,看看默认的权限是多少?

目录时755

文件和目录管理(四)


文件是644:

文件和目录管理(四)

这是为什么???是谁规定的?这就要学习一个指令umask了

#umask

文件和目录管理(四)

umask会打印一个值0022给我们看。这个值和文件的默认权限有啥关联呢?

因为普通文件没有可执行权限,只有rw两个,因此最大值为666,666-0022=644

因为目录有可执行权限,有rwx三个,因此最大值为777,777-0022=755,

所以目录的默认权限是755,文件的默认权限是644

所以我们可以通过修改umask的值来达到修改文件默认权限的目的。

#umask 0002

那么文件就是666-0002=664,目录就是777-0002=775了

但是默认请最好使用系统默认的。

0022中最前面多了个0是什么意思?没什么意思,代表这个数是八进制的


4.6.5 修改文件的特殊属性

change attribute

chattr [+-=] [Asaci] [文件或者目录名]

+-=分别代表增加减少和设定

A    增加该属性后,文件和目录的atime将不可被修改

s    增加该属性后,会将数据同步写入磁盘中

a    增加该属性后,表示只能追加,不能删除,只有root用户可以使用该参数

c   增加该属性后,表示自动压缩文件,读取时会自动解压

i    增加该属性后,表示文件不能删除,重命名,设定链接,写入以及新增数据


list attribute

lsattr [-aR] [文件/目录名]        该命令用来读取文件和目录的特殊权限

-a    类似于ls的-a选项,即连同隐藏文件一同列出

-R    连同子目录的数据一同列出



set uid,set gid和sticky bit

之前我们介绍权限的时候都是755 644等,其实在他们最前面还有一个权限,完整的应该是:?755,?644

set uid,该权限针对二进制可执行文件。使文件在执行阶段具有文件所有者的权限。比如passwd这个命令就具有该权限,当普通用户使用passwd的时候就可以临时获得root的权限,从而更改密码


set gid,该权限可以作用在文件上(二进制可执行文件),也可以作用在目录上。作用在文件上的时候,其功能和set uid一样,当用户在执行文件阶段将具有文件所有组的权限。如果作用在目录上,那么任何用户在此目录下创建的文件都具有和该目录所属的组相同的组


sticky bit 可以理解为防删除位,文件是否可以被某用户删除,主要取决于该文件所在的目录是否对该用户具有写权限。如果没有写权限,那么则这个目录下的所有文件都不能删除,同时也不能添加新的文件。

如果希望用户能能够添加文件但是不能删除该目录下的其他用户的文件,则可以对父目录添加该权限。添加该权限后就算用户对目录具有写权限,也不能删除此目录下其他用户的文件。


例如:passwd设置了uid权限,而/tmp设置了sticky bit权限 我们就去看看即可:

文件和目录管理(四)

文件和目录管理(四)

可以看到,passwd的所有者权限显示的是rws r-x r-x   =  (s--),用数字表示是:4755

而tmp的其他人拥有的权限是rwx rwx rwt   = (--t),用数字表示是1777,

这是怎么计算的呢?

当有特殊权限的时候:第一位数字可以是:

0,

1(--t),

2(-s-),

3(-st),

4(s--),

5(s-t),

6(ss-),

7(sst)

就是说s设置在所有者的权限的x位上就是set uid 

如果说s设置在所有组的权限的x位上就是set gid,

t设置在其他人权限的的x上就是sticky bit,

他们都只能设置在可执行位上,即x上。


说了这么多如何给他添加呢?

set uid: 

    #chmod u+s 文件名

set gid:

    #chmod g+s 文件名

sticky bit: 

    #chmod o+t 文件名


4.7 在Linux下搜索文件

-------------------------------------------------------------------------------

4.7.1 查看可执行文件的绝对路径

#which vim

4.7.2用whereis查找文件

whereis  [-bms] [文件名称]

-b    只查看二进制文件 

-m    只查看帮助文件

-s    只查看源代码文件

这个命令类似于模糊查找

文件和目录管理(四)


4.7.3 用locate命令查找文件

此命令类似于whereis,而且还要安装mlocate软件包才能使用命令。所以不常用,不推荐使用

4.7.4 使用find搜索文件

find [路径] [参数]

-atime +n/-n 表示访问或执行时间大于或小于n天的文件

     access time 是读取文件或者执行文件时更改的时间

-ctime +n/-n 表示写入更改inode属性(如更改所有者,权限或者链接)的时间大于或小于n天的文件

    change time 是写入文件,更改所有者,权限或链接设置时随inode的内容的更改而更改的

-mtime +n/-n 表示写入时间大于或小于n天的文件,

    modify time 是写入文件是随文件内容的更改而更改的


-name 文件名

    表示直接找这个文件名的文件

-type 文件类型(f,b,c,d,l,s)

    表示找指定类型的文件



4.8 Linux文件系统简介

-------------------------------------------------------------------------------

Linux使用的文件系统有

etx2:早期的系统使用此版本

etx3:Centos5使用此版本

ext4:Centos6使用此版本

xfs:Centos7使用此版本



4.9 Linux的文件类型

----------------------------------------------------------------------------------

l    链接文件

-    普通文件

d    目录

s    套接字文件

c    串口文件

b    块设备文件


4.9.1 linux的链接文件

Linux系统要读取一个文件的时候首先是读取他的iNode信息,然后根据iNode信息到块区域中将数据取出来。

ls -li 就能看到文件的inode

文件和目录管理(四)


那什么是链接呢?

链接文件是一种文件,分为硬链接和软链接

硬链接

        硬链接就是创建一个inode连接到文件放置的块区域

        不能跨文件系统,不能链接目录

软链接

        软链接文件的行为会传播给源文件上,例如有一个文件a,我们创建一个软链接b指向了a,当对b做操作的时候b会把动作转发到a上,这样就相当于简介的读取了a文件。

        

ln [-s] [来源文件] [目的文件]

-s  软链接

不加就是硬链接

        

感性趣的可以试着创建软硬链接,然后删除,看看他们的变化