鸟哥的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。

时间: 2024-12-26 18:51:36

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

鸟哥的Linux私房菜 基础学习篇读书笔记(9):Linux磁盘与文件系统管理(2)

上一篇文章主要从理论上分析了Linux的Ext2文件系统,这一篇主要讲解如何查看Linux的文件系统的容量以及讲解Linux文件系统中的连接文件. 可以通过df和du命令来查看磁盘与目录的容量,df命令用来列出文件系统的整体磁盘容量,df命令的用法是 df  [-ahikHTm]  目录或文件名,如果df命令不加任何参数,则默认将系统内所有的文件系统的容量以及使用情况都列出来.关于df命令还需要说明的是 df命令是查看文件系统的整体使用情况,因此是从Super block(见前一篇文章)中读取信

鸟哥的Linux私房菜 基础学习篇读书笔记(8):Linux磁盘与文件系统管理(1)

Linux最传统的磁盘文件系统就是EXT2了(当然现在已经升级成为EXT4),这一章主要介绍Linux的磁盘文件系统,而这篇文章主要聚焦的是Linux的EXT2文件系统. 我们都知道磁盘分区完成之后要进行格式化,之所以要格式化就是因为每种操作系统所使用的文件系统格式是不一样的.在Linux中,主要就是EXT2这种文件系统格式了,默认情况下Windows操作系统是无法识别Linux的EXT2文件系统.通常情况下,一个分区就是一个文件系统,但是由于新技术的利用,我们可以将多个分区合成一个文件系统,因

鸟哥的Linux私房菜 基础学习篇读书笔记(10):Linux磁盘与文件系统管理(3)

这篇文章主要总结在Linux操作系统中管理我们的硬盘和文件系统所需要用到的命令.当我们在系统中增加了一块硬盘,我们需要经历哪些步骤才能真正使用这块硬盘呢?大致可以分为以下步骤: (1)对磁盘进行分区,新建可以使用的分区: (2)对分区进行格式化,将分区格式化为我们操作系统能够使用的文件系统: (3)对新建好的文件系统进行检验: (4)创建挂载点,将该文件系统挂载上来. 接下来就介绍磁盘分区,格式化,检验和挂载的相关命令. 磁盘分区通过 fdisk命令进行,fdisk命令的基本使用方法 为"fdi

【Linux】鸟哥的Linux私房菜基础学习篇整理(一)

最近,一直在写PPC的模拟器和汇编器,也在做设计.所以重新看了看<鸟哥的Linux私房菜>,还是有好多命令不太熟悉.就打算写几篇blog记下来. 1. nl [-bnw] filename:添加行号打印参数:-b:指定行号指定的方式,主要有两种: -b a:表示不论是否为空行,也同样列出行号(类似cat -n): -b t:如果有空行,空的那一行不要列出行号(默认值).-n:列出行号表示的方法,主要有三种: -n ln:行号在屏幕的最左方显示: -n rn:行号在自己字段的最右方显示,且不加0

【Linux】鸟哥的Linux私房菜基础学习篇整理(二)

1. dumpe2fs [-bh] devicename:查询superblock信息.参数:-b:列出保留为坏道的部分:-h:列出superblock的数据,不会列出其他的区段内容. 2. df [-ahikHTm] 目录或文件名:列出文件系统的整理磁盘使用量.参数:-a:列出所有的文件系统,包括系统特有的/proc等文件系统:-k:以KB的容量显示各文件系统:-m:以MB的容量显示各文件系统:-h:以人们易阅读的GB.MB.KB等格式自行显示:-H:以M=1000K替代M=1024K的进位方

【Linux】鸟哥的Linux私房菜基础学习篇整理(七)

1. test命令的测试功能.测试的标志:(1)关于文件类型的检测 test [-efdbcSpL] filename-e:该文件名是否存在:-f:该文件名是否为文件:-d:该文件名是否为目录:-b:该文件名是否存在且为一个block device设备:-c:该文件名是否存在且为一个character device设备:-S:该文件名是否存在且为一个Socket文件:-p:该文件名是否存在且为一个FIFO文件:-L:该文件名是否存在且为一个连接文件.(2)关于文件权限的检测 test [-r]

【Linux】鸟哥的Linux私房菜基础学习篇整理(九)

1. quotacheck [-avugfM] [/mount_point]:扫描文件系统并创建Quota配置文件.参数:-a:扫描所有在/etc/mtab内,含有quota支持的文件系统,加上此参数后,不必写/mount_point:-u:针对用户扫描文件与目录的使用情况,会新建aquota.user:-g:针对用户组扫描文件与目录的使用情况,会新建aquota.group:-v:显示扫描过程的信息:-f:强制扫描文件系统,并写入新的quota配置文件(危险):-M:强制以读写的方式扫描文件系

Bombe 【Linux】鸟哥的Linux私房菜基础学习篇整理(三)

1. gzip [-cdtv#] filename:压缩.参数:-c:将压缩的数据输出到屏幕上,可通过数据重定向进行处理:-d:解压缩的参数:-t:可以用来检验一个压缩文件的一致性,查看文件有无错误:-v:可以显示出原文件/压缩文件的压缩比等信息:-#:压缩等级,1最快(压缩比最差),9最慢(压缩比最好),默认6. 2. zcat *.gz:读取gzip压缩文件. 3. bzip2 [-cdkzv#] filename:压缩.参数:-c:将压缩过程中产生的数据输出到屏幕上:-d:解压缩的参数:-

【Linux】鸟哥的Linux私房菜基础学习篇整理(十二)

1. depmod [-Ane]:更新内核模块依赖.参数:无参数:depmod会主动分析目前内核的模块,并重新写入/lib/modules/$(uname -r)/modules.dep中:-A:depmod会查找比modules.dep内还要新的模块,如果找到符合模块才更新:-n:不写modules.dep,而将结果输出到屏幕:-e:显示目前已加载的不可执行的模块名称. 2. lsmod:查看内核目前加载的模块. 3. modinfo [-adln] [module_name|filename