首页 > 代码库 > 鸟哥的Linux私房菜 基础学习篇读书笔记(7):Linux文件与目录管理

鸟哥的Linux私房菜 基础学习篇读书笔记(7):Linux文件与目录管理

这一章主要讲述的是如何操作与管理Linux系统中的文件和目录,主要包括目录间的切换,目录的创建与删除,文件的创建与删除,文件的查找,文件内容的查看等等。

前一章中已经讲过相对路径以及绝对路径,绝对路径就是指从根目录(“/”)开始写起的路径名,而相对路径绝不会由根目录开始写起,相反,相对路径是相对于当前工作目录的路径名。Linux操作系统中有几个特殊的目录:

          . 代表此层目录;

          .. 代表上一层目录;

          - 代表前一个工作目录;

          ~ 代表当前用户身份所在的主文件夹;

          ~account 代表account用户的主文件夹(account为账户);

Linux下几个常见的操作目录与文件的命令:

(1) cd (change directory) 是切换目录的命令,用法为 cd [相对路径名或绝对路径名],一个小细节需要注意,当cd 后面不接任何路径时,代表回到自己的主文件夹的意思(对于root身份,即为/root/,对于一般的用户身份account,即为/home/account)。

(2)pwd 显示当前所在的目录。

(3)mkdir 新建目录,用法为 mkdir [-mp] 目录名称。默认情况下,mkdir命令创建目录需要一层一层地创建才行,但是也可以通过-p参数帮助你直接将所需要的目录(包含上层目录)递归的创建起来。

(4)rmdir 删除空的目录,用法为 rmdir [-p] 目录名称,目录的删除也需要一层一层来删除,而且被删除的目录里面必定不能存在其他的目录或文件,也就是说被删除的目录必须为空目录,也可以尝试使用 -p 参数将上层目录也同时删除。

(5)在Linux中,ls命令可能是使用频率最高的命令,因为ls命令让我们知道文件或目录的相关信息,包括文件的属性,权限等各种信息。

(6)如果想要完成文件的复制,可以使用cp命令,用法为 cp 源文件  目标文件,或 cp 源文件1 源文件2 源文件3 ...... directory。在默认条件下,cp的源文件与目的文件的权限是不同的,目的文件的所有者通常会是命令操作者本身。所以有时候用cp命令备份一些文件时,我们需要注意将该文件的所有属性,权限也完整的复制过来,就需要使用 -a 或 -p 参数了。cp命令也可以复制目录,就需要使用-r参数。

(7)rm 移除文件或目录,之前讲过rmdir删除目录只能删除空目录,而用“rm -r 目录名”可以删除非空目录,由于rm相对来说是个比较危险的命令,所以为了怕文件被误删,很多distribution 默认把-i 参数加入到rm 命令中,即删除之前会询问,如果你想直接删除而忽略询问,就需要使用 \rm ,通过在命令之前加上反斜杠,就可以忽略掉alias的指定参数。

(8)mv 移动文件与目录,或更名。使用方法为 mv [-fiu] source destination  或者 mv source1 source2 source3 ...... directory。mv除了移动文件或目录,另一个用途就是更改文件名。例如 mv mvtest mvtest2,就可以将mvtest重命名为 mvtest2。

(9)对一个给定的完整的文件名,我们可以通过斜线来分别出哪部分是文件名,哪部分又是路径名。当然还可以通过 basename命令来取得路径中的文件名,通过dirname命令来取的路径中的目录名。


对于一个普通文件,我们可以通过以下几个命令来查看文件内容:

          cat : 从第一行开始全部的文件内容

          tac :从最后一行显示全部文件的内容

          nl:  显示的时候顺便显示行号

          more:一页一页地显示文件内容

          less: 一页一页地显示文件内容,但是允许向前翻页

          head: 只显示前几行

          tail:只显示结尾几行

          od:   以二进制方式读取文件内容。

简单地对比这几个显示文件内容的命令,cat命令是Concatenate(连续)的简写,将整个文件的内容显示在屏幕上,所以cat命令存在一个问题,就是当整个文件内容比较多,超过屏幕尺寸时,我们就只能看到最后显示在屏幕上的内容,之前显示的结果根本来不及看到。tac命令和cat命令正好相反(从名字上也能看出),tac命令从文件的最后一行开始把文件内容连续地显示在屏幕内容上。nl命令显示文件内容时自动加上行号。相比于cat,tac和nl命令一口气将文件内容显示在屏幕上,more命令允许翻页显示文件内容。但是more命令查看文件内容时无法向前翻页,只能向后翻页,如果还想向前翻页,就得使用less命令了,所以less命令相对于more命令更具有弹性而且man这个命令就是调用less命令来显示说明文件的内容。我们还可以通过head 或 tail命令来对输出数据做个简单的选取,head 显示文件的前几行,而tail命令用来选取文件的后几行。od命令允许我们读取非纯文本文件,例如二进制文件,od命令允许我们用不同的类型来输出,例如八进制,十进制,ASCII字符等类型来输出。

接下来介绍touch命令,touch命令主要有两个功能:修改文件时间和创建新文件。在Linux操作系统中,每个文件都有三个时间参数,分别为:文件内容访问时间atime(access time),文间内容修改时间mtime(modification time),状态修改时间ctime(status time)。ls -l 命令默认显示的是文件的mtime,即文件内容最近一次被修改的时间。

touch命令的使用方法为 touch [-acdmt] 文件名,默认情况下touch 后面接文件,则该文件的三个时间都会更新为当前时间,如果该文件不存在,还会自动创建一个新空的文件。

当我们用touch新增一个文件或用mkdir命令新建一个目录时,该文件或目录的默认权限是什么呢?这就与umask有关了。可以使用umask命令来查看当前系统的umask值。例如输入umask命令,可以得到数字形态的权限设置分数,也可以使用umask -S 以符号的形式显示出权限设置。例如以下情况:

          # umask

          0022

          # umask -S

          u=rwx, g=rx, o=rx

umask的分数值指的的默认权限应该减去的值。而需要注意的是,新建文件和新建目录的默认权限是不一样的。文件默认是不需要可执行权限的,所以新建文件的默认权限值是rw-rw-rw-,但对目录而言,可执行权限意味着能否进入该目录,所以目录的默认权限均开放,即目录的默认权限为rwxrwxrwx。但umask的输出为什么会有四个数字呢,第一个数字代表的是特殊权限,后面的三个数字则分别对应所有者,用户组,其他人应该减去的权限。

以上面为例,由于umask的分数值代表的是默认权限应该减去的值,所以当新建文件时,由于文件的默认权限为rw-rw-rw-,但由于umask的后三个数字为022,即文件所有者的权限不变,但用户组和其他人的写权限应该减去,所以新建文件的最后权限为rw-r--r--。但新建目录时,由于目录的默认权限为rwxrwxrwx,再减去umask相对应的值,最后新建目录的权限即为rwxr-xr-x。

chattr命令用来设置文件的隐藏属性,这些文件的隐藏属性对于系统安全上面有很大的帮助。 chattr命令中最重要的两个属性是+a和+i,对一个文件设置+a属性后,这个文件只能增加数据而不能修改数据,而对一个文件设置+i属性后,则该文件不能被删除,改名,设置连接等,+a和+i这两个属性都只有root才能设置。lsattr命令用来查看文件的隐藏属性。

本章的一个重点内容是文件的三个特殊权限:SUID,SGID,SBIT。当我们用ls -l 命令查看 /usr/bin/passwd这个文件的属性时,其第一个字段是这样的: -rwsr-xr-x。 很奇怪,文件的权限不是只有r,w,x吗,为什么又出现了一个s? 这就涉及到SUID的概念。

当s出现在文件所有者的x权限位置上时,就称为 Set UID,简称SUID特殊权限。 SUID特殊权限对文件有什么意义呢?首先SUID仅对二进制程序有效,然后执行者需要对该文件拥有x权限,而且suid权限仅在执行该程序过程中有效,它将使得程序的执行者获得该程序文件所有者的权限。

SGID是指当s出现在文件所属用户组的x权限的位置上时,就称为Set GID,简称SGID。 不同于SUID只能针对文件来设置,SGID可以针对文件或目录来设置。当SGID针对文件来设置时,它只对二进制文件有用,而且程序的执行者对该程序拥有x权限,执行者在执行过程中将会获得该文件所属用户组的权限。当SGID针对目录设置时,它具有以下功能:当用户进入该目录下时(前提是对该目录具有r和x权限),用户在此目录下的有效用户组将会变成该目录的所属用户组,也就是说用户在该目录下新建文件(前提是用户对该目录具有w权限)时,新建文件的所属用户组和该目录的所属用户组相同。

SBIT是指Sticky Bit,翻译为中文应该是指“粘住位”,这个标志目前只对目录有效,对文件已经没有效果了。SBIT对目录的功能是当用户在该目录下创建文件或目录时(前提是用户对该目录具有写权限),仅有自己与root才有权利删除该文件。

我们已经知道,当使用数字形态更改文件权限时,只需要使用三个数字的组合即可。那现在如果还要设置SUID/SGID/SBIT权限,只需要在之前的三个数字前面在加上一个数字,4代表SUID,2代表SGID,1代表SBIT。所以想要把一个文件的权限改为“-rwsr-xr-x”,只需要使用命令 chmod 4775 filename即可。

可能读者还是会感觉这三个特殊权限很抽象,以后我再通过特殊实例讲解。最近在看大名鼎鼎的<<APUE>>(UNIX环境高级编程),其中有一章就是讲文件的属性,而文件属性就是围绕stat这个结构体的每个成员讲解的,其中就有“设置用户ID位”,“设置用户组ID位”,“粘住位”的底层讲解,其实这三个标志位就分别对应着文件的SUID,SGID,SBIT这三个特殊权限位。看完APUE的这一章,再来看鸟哥的讲解,发现能够理解的更深。例如鸟哥只是说“粘住位”目前对文件已经没有效果了,其实“粘住位”最初就是为二进制文件设置的,使那些经常运行的程序能够驻留在内存中,所以才有“粘住”的说法,只是后来UNIX对“粘住位”进行了扩展,让其对目录也有相关的功能。好吧,以后写关于<<APUE>>的读书笔记时再详细总结吧。

对于一个文件,我们可以通过file这个命令来得到这个文件的基本数据类型,通过file命令,可以判断一个文件是属于ASCII文本文件,或者是data文件,或者是二进制文件(此时还可以查看有没有使用到动态函数库等等信息)

有时候,我们需要知道某个文件的完整路径,或者查询某个文件放置在哪里。对于脚本文件,我们可以通过which查询某个命令的完整路径,使用方法为 which command,但是which是根据PATH环境变量所规范的路径去寻找“执行文件”的完整文件名,找到第一个即停止寻找。如果想要找出所有同名执行文件,需要加上 -a 参数。

whereis和locate命令都可以用来查找任意文件。whereis 和locate命令使用数据库来查找文件,所以相当快速。Linux操作系统会将所有文件信息都记录在一个数据库文件里,whereis和locate命令就是使用这个数据库文件来查找文件。虽然这种方式相当快速,但是数据库文件的更新并不是实时的(各个distribution不同,CentOS每天更新一次这个数据文件),所以使用whereis或locate命令查找文件时可能查找到已经删除的文件,或者刚刚新建的文件却查询不到。当然也可以通过updatedb来手动更新这个数据库文件,这样之后的查找就相对准确。

find命令也可以用来查找文件,但是find命令是直接查找硬盘,所以find命令查找的结果就非常准确,但是时间花费很多。而且find命令可以查找符合一定要求的文件。


本章Linux命令总结:

cd,pwd,mkdir,rmdir,rm,mv,basename,dirname,cat,tac,nl,more,less,head,tail,od,touch ,umask,chattr,lsattr,file,which,whereis,locate,find。




鸟哥的Linux私房菜 基础学习篇读书笔记(7):Linux文件与目录管理