鸟哥的Linux私房菜第六章——Linux文件和目录管理
文章目录
第六章:Linux文件和目录管理
一、目录和路径
1. 相对路径和绝对路径
- 绝对路径:路径的写法“一定由根目录 / 写起”,例如: /usr/share/doc 这个目录。
- 相对路径:路径的写法“不是由 / 写起”,例如由 /usr/share/doc 要到 /usr/share/man 下面时,可以写成: “cd …/man”这就是相对路径的写法啦!相对路径意指“相对于目前工作目 录的路径!”
2. 目录相关操作
- 在这之前,需要先认识几个特殊目录:
- . :当前这层目录
- … :当前这层的上一层目录
- -(减号) :前一个目录
- ~:当前使用者的主文件夹
- ~lzh:lzh这个用户的主文件夹
特殊的,所有目录下面都会存在的两个目录: . 和 . . ,根目录的上层目录…还是根目录自己
- 目录指令
- cd:变换目录
- pwd:显示当前目录
- mkdir:创建新目录
- redir:删除空的目录(!!)
cd
cd是Change Directory的缩写,这是用来变换工作目录的指令。
格式 cd 绝对路径/相对路径/一些特殊目录(Tab键可补全)
单纯的 cd 就表示cd~ 即用户主目录
pwd
pwd是Print Working Directory的缩写,显示目前所在目录的指令
以绝对路径的形式给出当前目录
选项:
- P(是大写的P哟):针对链接文件,使用后链接文件会显示为链接的那个目录
/var/mail是链接的/var/spool/mail
mkdir
mkdir (make directory),创建新目录
默认一次只能创建一层目录
格式:mkdir 待创建目录所在目录层次 / 要创建的目录名称
选项:
-p(这是个小写的p哟):递归创建多级目录
-m:创建的同时,给它设置权限(否则使用系统默认权限)
在当前工作目录中,一次性创建多个目录文件:
mkdir dir3 dir4 dir5(空格隔开)
rmdir
删除的是空 目录
默认一次只能删除一层
格式:rmdir 目录名
选项:
-p:若 删除目录后 的上层目录变为空,则连它一起删除掉
3. $PATH
环境变量
ls的目录为/bin/ls,那为什么可以在任何地方来使用ls呢,为什么不提示找不到该指令呢?——>环境变量PATH
当我们在执行一个指令的时候,举例来说“ls”好了,系统会依照PATH的设置去PATH定义的目录下搜寻文件名为ls的可执行文件。
所以在哪里都可以找到ls这个指令文件
查看PATH
echo $PATH(全大写)
echo:显示、打印
查看哪些目录被定义到了PATH中,PATH是个变量,而$后面就跟变量
变量内容由一堆目录构成,每个目录中间用冒号隔开
在前面的在寻找时会被先找到
不同用户的PATH不同
二、文件和目录管理
1. 文件和目录的检视:ls
只输入ls时,默认显示的只有:文件名
ls生效,这个目录对用户要有r读权限
只不过他会根据文件名进行一个排序,再加上会根据文件类型显示颜色
格式 ls [文件或目录名称](不写默认显示当前目录或文件的信息)
选项:
-a:显示隐藏文件(以.开头)
-d:只显示这个目录的信息,而不显示里面的文件信息
-l:列出属性和权限等信息(可以简写为ll)
要想显示其他信息,需要加上选项
2. 复制、删除、移动:cp、rm、mv
cp 复制文件或目录
格式 cp 源文件 目标文件
cp 多个文件 目标一定是目录
源文件是某个目录下的某个文件
目标文件是把源文件自己复制到某个目录层级下的一个文件
前提是源文件 要存在,而目标文件 不存在(目标文件的名字就是复制后文件的名字)
这里只能暂时复制文件,不能复制目录
选项
-i(不写默认也有-i):当复制后的文件的名字已经存在时,会询问是否覆盖
复制过程中,默认不会复制文件的权限、创建时间
这个权限是系统默认权限,时间是复制指令执行的时间
复制之后,我们想要这个副本成为我们自己的文件(而不是源文件的主人),那么如何修改?
选项:
-p:连同文件的属性(权限、用户、创建时间)一起复制(但是一般用户不能随意修改拥有者和群组信息,所以一般用户不能完全复制)
-d:若源文件是链接文件,则复制这个文件链接的哪个文件(而不是这个快捷方式)
-r:用于复制目录,递归复制(复制空目录也要用这个)(加上后也可以用于复制文件)
-a:这个厉害,== -p + -d + -r
在Windows中我们经常在桌面设置快捷方式,而快捷方式像是复制了一份似的,但它并不是复制,只是一个链接而已
选项:
-s:创建一个文件(或目录)的快捷方式,即链接文件
链接文件的属性和权限全是rwx
总结:
在复制前,一定要清楚:
- 是否需要完整的保留来源文件的信息?
- 来源文件是否为链接文件 (symbolic link file)?
- 来源文件是否为特殊的文件,例如 FIFO, socket 等?
- 来源文件是否为目录?
rm 删除文件或目录
rmdir只能删除 空的目录
rm可以删除文件、目录
格式 rm 文件或目录名
选项:
-i:删除之前进行询问(默认就有-i)
rm test* #表示删除所有以test开头的文件(使用通配符删除多个文件)
空目录rmdir可以删除,但是rm默认不能删除 空目录,非空目录,都不行
选项:
-r:删除目录(包括空目录也要加-r),递归删除
删除时,会先一层一层得询问是否进入到该目录的最里层,然后从最里层开始再一层一层的询问是否删除,直到删除最外层
为什么会有提示呢?——> 因为Linux已经给它内置了-i选项
那么如果已经确定好了要删除这个目录,不想要一次次的提示怎么办呢?
答:在rm前加上\就可以忽略掉提示了
mv 移动、更名 文件或目录
移动相当于是剪切,全程只有一份,搬到另一个目录下
格式 mv 源文件 目标
mv 多个源文件 一定是目录
-
下图,创建目录ls,将ls3移动到ls中
-
将ls中的ls3移动到(没有写目录就表示当前目录),并且更名为ls4,ls变为空
-
将ls4更名为ls44
三、查阅文件内容
前面都是对文件本身和目录进行操作,而文件是要保存内容的,那么如何查阅文件内容呢?
- cat 由第一行开始显示文件内容
- tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
- nl 显示的时候,顺道输出行号!
- more 一页一页的显示文件内容
- less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
- head 只看头几行
- tail 只看尾巴几行
- od 以二进制的方式读取文件内容!
1. 直接查看文件内容 cat/tac/nl
- cat (concatenate 连续):将一个文件的内容连续的印出在屏幕上面
cat 文件名
选项
-n / -b:如果文件内容较多,需要显示行号的话,加上-n/-b
-n空白行也会标号,-b不标空白行
- nl:与cat差不多,但是nl默认就带有行号
nl主要是对行号的显示方式进行设置
选项:
-b:指定方式
-b a:表示-b这个选项取a那种方式,==cat -n
-b t(默认):==cat -b
-n:行号表示方法
-n ln:行号最屏幕的最左方
-n rn(默认):行号在 距离屏幕最左边6个字符(行号字段) 的位置(行号前面不加0)
-n rz:行号在距离屏幕最左边6个字符的位置(行号前面加0)
-w(默认为6):行号字段默认是最左边的6个字符的位置,-w 3表示行号字段改为最左边的3个字符
2. 翻页式查阅
cat、nl都是把文件内容一下子全给打印出来给你看
但是当文件内容较多,这样就不太方便了,最后把内容一页一页地打印出来
- more(一页页地翻动)
more 文件名
不会把内容打印出来,而是进入一个阅读模式,刚开始显示第一页内容
空格:翻下一页
回车:下一行
b:上一行
/字符串:在阅读模式中输入 / 后就可以查找字符串了
:f :输入冒号和f后会显示出文件名和已显示的行数
q:立即离开阅读模式,不会打印(如果阅读玩了内容会自动退出来并打印内容)
- less
用法和more差不多,less 文件名 ,之后会进入到一个阅读模式,但是less更方便
man指令就是调用的less进行输出内容的
more中的用法在less中同样适用
more中不能使用方向键,准确的说是pageup、pagedown、home、end四个键,而less中可以使用
pageup/pagedown:按上下键是上下一行,如果pageup、pagedown这俩键安在了上下键(共用键),需要使用Fn键(功能键)+上下键 这个整体才表示pageup、pagedown这俩键,用来上下翻页
home/end:翻到 首页 / 尾页(如果是共用键需要加Fn键)
除了more中的,还有哪些呢?
/字符串:从上往下向下搜寻
?字符串:从下往上向上搜寻
n:查询出来的有多个,会显示第一个,n会跳到搜寻到的下一个(和/还是?有关)
N:跳到搜寻到的上一个(和/还是?有关)
g:跳到第一行
G:跳到最后一行
3. 显示特定内容(数据撷xie取)
- head(取出前几行)
head -n 数字(默认为10,负数表示最后这些行不打印) 文件名
举例来说 CentOS 7.1 的 /etc/mandb.conf 共有131行, 则上述的指令“head -n -100 /etc/man_db.conf” 就会列出前面31行,后面100行不会打印出来
- tail
tail -n 数字(默认为10,+一个数表示前面这些行不打印) 文件名
当下达“tail -n +100 /etc/man_db.conf” 代表该文件从100行以后都会被列出来,同样的,在man_db.conf共有131 行,因此第100~131行就会被列出来啦! 前面的99行都不会被显示出来喔
例题:假如我想要显示 /etc/man_db.conf 的第 11 到第 20 行呢?
答:这个应该不算难,想一 想,在第 11 到第 20 行,那么我取前 20行,再取后十行,所以结果就是:“ head -n 20 /etc/man_db.conf | tail -n 10 ”,这样就可以得到第 11 到第 20 行之间的内容了!
这两个指令中间有个管线 (|) 的符号存在,这个管线的意思是:“前面的指令所输出的讯息,请通过管线交由后续的指令继续使用”的意思。
所以, head -n 20 /etc/man_db.conf 会将 文件内的 20 行取出来,但不输出到屏幕上,而是转交给后续的 tail 指令继续处理。因此 tail “不需要接文件名”,因为 tail 所需要的数据是来自于 head 处理后的结果!
承上一题,那如果我想要列出正确的行号呢?就是屏幕上仅列出 /etc/man_db.conf 的 第 11 到第 20 行,且有行号存在?
答:我们可以通过 cat -n 来带出行号,然后再通过 head/tail 来撷取数据即可!
所以就变成如下的模样了: cat -n /etc/man_db.conf | head -n 20 | tail -n 10
4. touch,创建文件或修改文件时间
ls -l 中,我们看到有一个和文件相关的时间,这个时间是什么意思呢?
文件有三个时间参数:
- mtime(modification time):文件的内容发生变化时,会更新这个时间
- ctime(status time):文件的属性发生变化时,会更新这个时间
- atime(access time):文件被查阅时,会更新这个时间
那么,ls -l中显示的那个时间是什么时间呢?
答:
显示的是mtime,即内容发生变化时的时间
如果一个文件创建之后没有修改过内容,那么mtime就是创建的时间
(文件刚创建时,三个时间都是文件的创建时间)
touch 文件(若文件不存在,则创建文件,同时三个时间都更新为当前时间)
选项:
-a:只修改atime
-c:只修改ctime
-m:只修改mtime
-d:上面三个默认修改成当前时间,-d后面+想要修改的时间或 --time="时间"
-t:也是不使用当前时间,后面+[YYYYMMDDhhmm]时间格式
没有-a、-c、-m:表示三个时间都更新,如果是创建新文件则三个时间更新为当前的时间;
如果是-a全复制的文件,那么ctime更新为当前时间,但是文件内容是复制过来的,mtime、atime和源文件一样(全复制-a不能复制ctime这个属性)
如果是旧文件,则只能将mtime和atime更新为当前时间,ctime保持不变(属性修改的时间不能随便变)
四、默认权限和隐藏权限
复习:
-
lzh这个一般用户想拥有root的.bashrc文件,该怎么办?
答案:由root来操作:先复制,cp ~/.bashrc ~lzh/bashrc
再修改属性:chown lzh:lzh ~lzh/bashrc(将这个文件的拥有者改为lzh,群组改为lzh)
(一般用户不能使用chown) -
lzh这个用户创建一个目录,且该目录任何人都可以浏览,但是除了lzh外都不能修改目录
答案:
lzh用户创建目录,mkdir /tmp/ch1
修改属性,chmod -R 755 /tmp/ch1(递归将该目录权限改为755,目录需要加-R:目录内的文件也改为这个权限)
1. 默认权限:umask
前面我们已经可以改变文件的权限了,但是如果我们不修改权限,那么创建的时候,它是有一个默认的权限的——这个东西就和umask有关了
umask # 显示出创建文件或目录时要 去掉的权限(显示4位,第一位是特殊权限不用管)
# 选项:
umask -S # 以符号的形式显示出u、g、o权限
0022就表示,u啥也不去掉=rwx,g和o去掉2(就是w权限)=r-x(去掉w用 - 代替)
那么去掉某些权限,是在哪的基础上去掉呢?
对于文件来说:
文件的x权限一般来说没有意义,所以文件的权限为:-rw-rw-rw-(666)
对于目录来说:
目录的x权限代表能够进入到该目录中,所以目录权限为:drwxrwxrwx(777)
那么,上述的umask,你知道代表什么了吧!
umask:0022
创建文件目录时去掉g和o的w权限
所以创建时的默认权限为:
文件:-rw-r--r--
目录:drwxr-xr-x
使用场景
创建文件时,我们可以通过chmod修改权限,但是如果要修改的比较多,总不能每个创建的时候都去修改吧,那么我们就可以通过修改umask的值的方式来修改文件的默认权限,这样每次创建新的文件就不用再去专门修改它的权限了
例题:lzh用户创建的文件,要能够被lzh这个群组里的人修改,怎么办
文件对群组的默认权限是r–,群组内想修改的话,r–需要改为rw-
改变umask为0002
umask 0002
2. 隐藏属性
文件可以有隐藏属性,默认是不显示的,隐藏属性一般用在系统安全上
lsattr 文件或目录 # 显示文件隐藏属性
选项:
-a:列出的文件隐藏属性,包括隐藏文件
-d:后加目录,则只列出该目录的隐藏属性
-R:后加目录,连同子目录内的文件的隐藏属性也列出来
chattr [+-][] 文件或目录 # 给文件设置隐藏属性
选项:
+:添加一个隐藏属性
-:删除一个隐藏属性
a(只能root):+a之后,该文件只能增加数据,不能删除和修改
i(只能root):+i之后,该文件不能被删除、更名、设置连接、写入数据
...(这里只列出了a和i两个比较常见的)
例如log file登录文件,需要+a,这种文件只能增加内容,不能修改和删除内容
chattr指令只能在Ext2/Ext3/Ext4的 Linux 传统文件系统上面完整生效, xfs 仅支持部份参数
3. 特殊权限:SUID、SGID、SBIT
/tmp 权限怪怪的,还有 /usr/bin/passwd 也怪怪的?怎么回事啊?
s 与 t 这两个权限的意义与系统的帐号 (第十三章)及系统的程序(process, 第十六章)较为相关, 所以等到后面的章节谈完后你才会比较有概念!
4. 查看文件类型:file
之前提到过,Linux中全都是文件,而文件又分成了很多种类,
那么如何查看一个文件的类型呢?
file 文件名
五、指令和文件的搜寻
1. 指令文件的搜寻
在第四章中在帮助指令中提到了内部指令和外部指令,如下图
可见,Linux中的指令还要分成shell内嵌的指令(内存中)和非内嵌指令(硬盘文件中)
那么如何查询指令文件呢?
注意既然要查找指令文件,那么首先这个指令文件得存在,而内嵌指令在内存中,它们没有指令文件
所以应该是 查找非内嵌的指令文件
which 指令名称
选项:
-a:列出该指令所有同名文件(不加表示只列出查到的第一个)
前面说过,指令文件所在的目录在环境变量PATH中存在,所以which这个指令是去PATH中有的目录里去寻找
ls没有加-a但是查找出了2个,因为alias是别名,ls就==后边的
至于内嵌指令不能使用which,可以通过type来判断是不是内嵌指令
2. 文件的搜寻
- whereis
- locate
- find(前两个不行,再用find,不常用)
whereis
whereis是在特定的目录中去寻找文件
是哪些特定目录呢?
whereis -l # 列出whereis的特定目录
可以看出主要是一些二进制文件和man说明文档文件,还有几个src目录
不过,whereis还可以从这些特定目录中再细分
选项:
-b:只找二进制文件
-m:只找man说明文档文件
问题:既然whereis是在特定目录中找,那么一定有一些文件是找不到的!
locate / updatedb
whereis 后面要加完整的文件名,也就是说,如果你记不太清文件的完整名了,但是记得其中的一部分,那就不能使用whereis了
而locate恰好可以跟文件的部分名称
locate keyword(文件名的关键字)
选项:
-i:忽略名字大小写
-c:计算找到的文件数量并输出
-l 数字:输出找到的前几个
-r:后面可接正则表达式
-S:输出locate使用的数据库文件的相关信息
locate速度较快,因为它没有到硬盘中去寻找,而是使用一个"已创建的数据库/var/lib/mlocate/"里面的数据搜寻到的
它也是有限制的,因为数据库文件里的内容是一天只更新1次,也就是说,如果此时我创建一个文件,然后使用locate是找不到该文件的——因为数据库还没有更新呢!
不过,我们可以手动来更新这个数据库
updatedb
直接输入updatedb即可
updatedb 指令会去读取 /etc/updatedb.conf 这个配置文件的设置,然后再去硬盘里面进行搜寻文件名的动作, 最后就更新整个数据库文件啰!因为 updatedb 会去搜寻硬盘,所以当你执行 updatedb 时,可能会等待数分钟的时
find
这个搜寻指令功能很强大,但是性能不好,所以一般使用前两个,实在不行再使用find
格式:
find 查找目录 选项 选项值
find后要指定在哪里进行查找,/ 表示所有目录内查找
选项:
- 时间选项(以执行命令的时间为基准,以mtime为例)
- -mtime n:n为数字,表示n天前的那一天内(不一定是一个整天,可能是横跨两天的)更新过内容的文件
- -mtime +n:n天之前(不含n天本身)更新过内容的文件
- -mtime -n:n天之内(含n天本身)更新过内容的文件
- newer 文件名:列出比这个文件还要新的文件
- 使用者和群组选项
- 名称和权限选项
- 额外动作
一般搜寻的的文件,直接把每个文件的路径打印出来,没有其他操作
使用额外动作可以后接其他操作
-exec 指令 #exec后加其他指令来处理搜寻到的结果
比如搜寻到了一些文件后,我想要查看这些文件的信息
find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \
find 在寻找数据的时后相当的操硬盘!所以没事情不要使用 find 啦!有更棒的指令可以取代呦!那就是上面提到的 whereis 与 locate
六、极重要的复习!权限与指令间的关系