Linux文件、目录——鸟哥的Linux私房菜

本文详细介绍Linux系统中的文件和目录管理技巧,包括路径概念、文件操作命令、文件内容查阅方法、权限管理等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

鸟哥的Linux私房菜第六章——Linux文件和目录管理

第六章:Linux文件和目录管理

一、目录和路径

1. 相对路径和绝对路径

  • 绝对路径:路径的写法“一定由根目录 / 写起”,例如: /usr/share/doc 这个目录。
  • 相对路径:路径的写法“不是由 / 写起”,例如由 /usr/share/doc 要到 /usr/share/man 下面时,可以写成: “cd …/man”这就是相对路径的写法啦!相对路径意指“相对于目前工作目 录的路径!”

2. 目录相关操作

  1. 在这之前,需要先认识几个特殊目录
  • . :当前这层目录
  • … :当前这层的上一层目录
  • -(减号) :前一个目录
  • ~:当前使用者的主文件夹
  • ~lzh:lzh这个用户的主文件夹

特殊的,所有目录下面都会存在的两个目录: . 和 . . ,根目录的上层目录…还是根目录自己

  1. 目录指令
  • 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保持不变(属性修改的时间不能随便变)

在这里插入图片描述

四、默认权限和隐藏权限

复习:

  1. lzh这个一般用户想拥有root的.bashrc文件,该怎么办?

    答案:由root来操作:先复制,cp ~/.bashrc ~lzh/bashrc
    再修改属性:chown lzh:lzh ~lzh/bashrc(将这个文件的拥有者改为lzh,群组改为lzh)
    (一般用户不能使用chown)

  2. 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后要指定在哪里进行查找,/ 表示所有目录内查找

选项:

  1. 时间选项(以执行命令的时间为基准,以mtime为例)
  • -mtime n:n为数字,表示n天前的那一天内(不一定是一个整天,可能是横跨两天的)更新过内容的文件
  • -mtime +n:n天之前(不含n天本身)更新过内容的文件
  • -mtime -n:n天之内(含n天本身)更新过内容的文件
  • newer 文件名:列出比这个文件还要新的文件

在这里插入图片描述

  1. 使用者和群组选项

在这里插入图片描述

  1. 名称和权限选项
    在这里插入图片描述

在这里插入图片描述

  1. 额外动作
    一般搜寻的的文件,直接把每个文件的路径打印出来,没有其他操作
    使用额外动作可以后接其他操作
	-exec 指令 #exec后加其他指令来处理搜寻到的结果

比如搜寻到了一些文件后,我想要查看这些文件的信息

find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \

在这里插入图片描述

find 在寻找数据的时后相当的操硬盘!所以没事情不要使用 find 啦!有更棒的指令可以取代呦!那就是上面提到的 whereis 与 locate

六、极重要的复习!权限与指令间的关系

在这里插入图片描述
在这里插入图片描述

七、重点回顾

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LJFCZH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值