Linux基础知识——文件

本文详细介绍了Linux系统中文件与目录的基本操作,包括文件权限、时间属性、链接类型,以及常用的文件操作命令如ls、cd、mkdir、rmdir、touch、cp、rm、mv等。同时,讲解了如何修改文件权限,解释了硬链接与软链接的区别,以及如何使用cat、more、less等命令查看文件内容。
摘要由CSDN通过智能技术生成

一、文件

文件属性

用户分为三种:文件拥有者、群组以及其它人,对不同的用户有不同的文件权限。

使用 ls 查看一个文件时,会显示一个文件的信息,例如 drwxr-xr-x 3 root root 17 May 6 00:14 .config,对这个信息的解释如下:

  • drwxr-xr-x:文件类型以及权限,第 1 位为文件类型字段,后 9 位为文件权限字段
  • 3:链接数
  • root:文件拥有者
  • root:所属群组
  • 17:文件大小
  • May 6 00:14:文件最后被修改的时间
  • .config:文件名

常见的文件类型及其含义有:

  • d:目录
  • -:文件
  • l:链接文件

9 位的文件权限字段中,每 3 个为一组,共 3 组,每一组分别代表对文件拥有者、所属群组以及其它人的文件权限。一组权限中的 3 位分别为 r、w、x 权限,表示可读、可写、可执行。

文件时间有以下三种:

  • modification time (mtime):文件的内容更新就会更新;
  • status time (ctime):文件的状态(权限、属性)更新就会更新;
  • access time (atime):读取文件时就会更新。

文件与目录的基本操作

1. ls

列出文件或者目录的信息,目录的信息就是其中包含的文件。

# ls [-aAdfFhilnrRSt] file|dir
-a :列出全部的文件
-d :仅列出目录本身
-l :以长数据串行列出,包含文件的属性与权限等等数据

2. cd

更换当前目录。

# cd [相对路径或绝对路径]

3. mkdir

创建目录。

# mkdir [-mp] 目录名称
-m :配置目录权限
-p :递归创建目录

4. rmdir

删除目录,目录必须为空。

# rmdir [-p] 目录名称
-p :递归删除目录

5. touch

更新文件时间或者建立新文件。

# touch [-acdmt] filename
-a : 更新 atime
-c : 更新 ctime,若该文件不存在则不建立新文件
-m : 更新 mtime
-d : 后面可以接更新日期而不使用当前日期,也可以使用 --date="日期或时间"
-t : 后面可以接更新时间而不使用当前时间,格式为[YYYYMMDDhhmm]

6. cp

复制文件。如果源文件有两个以上,则目的文件一定要是目录才行。

# cp [-adfilprsu] source destination
-a :相当于 -dr --preserve=all
-d :若来源文件为链接文件,则复制链接文件属性而非文件本身
-i :若目标文件已经存在时,在覆盖前会先询问
-p :连同文件的属性一起复制过去
-r :递归复制
-u :destination 比 source 旧才更新 destination,或 destination 不存在的情况下才复制
--preserve=all :除了 -p 的权限相关参数外,还加入 SELinux 的属性, links, xattr 等也复制了

7. rm

删除文件。

# rm [-fir] 文件或目录
-i 删除前逐一询问确认。
-f 即使文件属性设为唯读,亦直接删除,无需逐一确认。
-r 将目录及以下之文件亦逐一删除(即递归删除)。

8. mv

移动文件。

# mv [-fiu] source destination
# mv [options] source1 source2 source3 .... directory
-f : force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖

修改权限

可以将一组权限用数字来表示,此时一组权限的 3 个位当做二进制数字的位,从左到右每个位的权值为 4、2、1,即每个权限对应的数字权值为 r : 4、w : 2、x : 1。

# chmod [-R] xyz dirname/filename

示例:将 .bashrc 文件的权限修改为 -rwxr-xr–。

# chmod 754 .bashrc

也可以使用符号来设定权限。

# chmod [ugoa]  [+-=] [rwx] dirname/filename
- u:拥有者
- g:所属群组
- o:其他人
- a:所有人
- +:添加权限
- -:移除权限
- =:设定权限

示例:为 .bashrc 文件的所有用户添加写权限。

# chmod a+w .bashrc

默认权限

  • 文件默认权限:文件默认没有可执行权限,因此为 666,也就是 -rw-rw-rw- 。
  • 目录默认权限:目录必须要能够进入,也就是必须拥有可执行权限,因此为 777 ,也就是drwxrwxrwx。

可以通过 umask 设置或者查看默认权限,通常以掩码的形式来表示,例如 002 表示其它用户的权限去除了一个 2 的权限,也就是写权限,因此建立新文件时默认的权限为 -rw-rw-r–。

目录的权限

文件名不是存储在一个文件的内容中,而是存储在一个文件所在的目录中。因此,拥有文件的 w 权限并不能对文件名进行修改。

目录存储文件列表,一个目录的权限也就是对其文件列表的权限。因此,目录的 r 权限表示可以读取文件列表;w 权限表示可以修改文件列表,具体来说,就是添加删除文件,对文件名进行修改;x 权限可以让该目录成为工作目录,x 权限是 r 和 w 权限的基础,如果不能使一个目录成为工作目录,也就没办法读取文件列表以及对文件列表进行修改了。

链接

1. 创建链接

# ln [-sf] source_filename dist_filename
-s :默认是实体链接,加 -s 为符号链接
-f :如果目标文件存在时,先删除目标文件

2. 实体连接(hard link,硬链接,硬式链接或实际链接)

通过文件系统的 inode 链接来产生新文件名,而不是产生新文件!这种称为实体链接 (hard link)。

我们知道:

  • 每个文件都会占用一个 inode ,文件内容由 inode 的记录来指向;
  • 想要读取该文件,必须要经过目录记录的文件名来指向到正确的 inode 号码才能读取。

硬链接只是在某个目录下新增一笔文件名链接到某 inode 号码的关连记录而已,而不是产生新的文件,也就不会占用新的存储空间。

创建硬链接

举个例子来说,假设我系统有个 /root/crontab ,它是 /etc/crontab 的实体链接,也就是说这两
个文件名链接到同一个 inode,如下图所示:
在这里插入图片描述

硬链接文件读取

我们在目录 /root/ 中创建了 /etc/crontab 的硬链接(使用 ln 命令),由上图可以看到两个文件名对应的inode都是34474855(通过ll -i 命令可以查看文件信息),而且可以看到对应的文件的硬链接个数变为2。而硬链接的文件读取示意图如下所示:
在这里插入图片描述

如上图所示,通过 目录 /etc/ 或 /root/ 的 inode 1 / inode 2 指定的 block 1 / block 2 找到两个不同的文件名(文件路径),而不管使用哪个文件名均可以指到源文件 crontab 的 real inode(34474855)去读取到最终数据(源文件 crontab 的内容)。

硬链接的特点
  • 删除任意一个条目(/etc/crontab 或 /root/crontab),文件还是存在,只要引用数量不为 0;
  • 可以使用任意一个条目(/etc/crontab 或 /root/crontab)来编辑文件;
  • hard link 只是在某个目录下的 block 多写入一个关连数据而已,不会增加 inode 也不会耗用 block 数量,即不占用新的存储空间。
硬链接的限制
  • 不能跨 Filesystem;
  • 不能 link 目录。因为 link 目录,会一起 link 该目录下的所有文件,这样会造成环境相当大的复杂度,所以目前 hard link 对于目录暂时还是不支持。

3. 符号链接(Symbolic Link,软链接,亦即是快捷方式)

Symbolic link 就是在创建一个独立的文件(会占用新的存储空间),而这个文件会让数据的读取指向他 link 的那个文件的文件名。

由于只是利用文件来做为指向的动作, 所以,当来源文件被删除之后,symbolic link 的文件会“开不了”, 会一直说“无法打开某文件!”。实际上就是找不到原始“文件名”而已啦!

创建符号链接

举例来说,我们先创建一个符号链接文件链接到 /etc/crontab 去看看:
在这里插入图片描述

由上表的结果我们可以知道两个文件指向不同的 inode 号码,当然就是两个独立的文件存在! 而且链接文件(/root/crontab2)的文件内容就是他会写上目标文件的“文件名”, 你可以发现为什么上表中链接文件的大小为 12 Bytes 呢? 因为箭头(->)右边的文件名“/etc/crontab”总共有 12 个英文,每个英文占用 1 个 Bytes ,所以文件大小就是 12Bytes了!

符号链接文件读取

我们在目录 /root/ 中创建了 /etc/crontab 的符号链接(使用 ln -s 命令),由上图可以看到两个文件名对应的inode是不一样的(通过ll -i 命令可以查看文件信息)。而符号链接的文件读取示意图如下所示:
在这里插入图片描述
由上图可知,由符号链接(/root/crontab2) 的 inode 读取到链接文件的内容(仅有文件名),根据文件名链接到正确的目录去取得目标文件的 inode , 最终就能够读取到正确的数据了。你可以发现的是,如果目标文件(/etc/crontab)被删除了,那么整个环节就会无法继续进行下去, 所以就会发生无法通过链
接文件读取的问题了!

符号链接的特点
  • 符号链接文件保存着源文件所在的绝对路径,在读取时会定位到源文件上,可以理解为 Windows 的快捷方式。

  • 符号链接是一个独立的文件,会占用属于自己的 inode 和 block ,即会占用新的存储空间。

  • 当源文件被删除了,链接文件就打不开了。

  • 因为记录的是路径,所以可以为目录建立符号链接。

获取文件内容

1. cat

取得文件内容。

# cat [-AbEnTv] filename
-n :打印出行号,连同空白行也会有行号,-b 不会

2. tac

是 cat 的反向操作,从最后一行开始打印。

3. more

和 cat 不同的是它可以一页一页查看文件内容,比较适合大文件的查看。

4. less

和 more 类似,但是多了一个向前翻页的功能。

5. head

取得文件前几行。

# head [-n number] filename
-n :后面接数字,代表显示几行的意思

6. tail

是 head 的反向操作,只是取得是后几行。

7. od

以字符或者十六进制的形式显示二进制文件。

# od [-A 地址进制] [-t 显示格式] 文件名
其中:
-A ( 地址进制)按指定的进制显示地址信息;
-t 指定数据显示的格式。

-A 指定的地址进制包括:

o:八进制(系统默认值)
d:十进制
x:十六进制
n:不打印位移值

-t 指定数据的显示格式的主要参数有:

c:ASCII字符或反斜杠序列(如\n)
d:有符号十进制数
f:浮点数
o:八进制(系统默认值)
u:无符号十进制数
x:十六进制数

例子:以ASCII码的形式显示文件aa中的内容:
# od -tc aa

指令与文件搜索

1. which

指令搜索。

# which [-a] command
-a :将所有指令列出,而不是只列第一个

2. whereis

文件搜索。速度比较快,因为它只搜索几个特定的目录。

# whereis [-bmsu] dirname/filename

3. locate

文件搜索。可以用关键字或者正则表达式进行搜索。

locate 使用 /var/lib/mlocate/ 这个数据库来进行搜索,它存储在内存中,并且每天更新一次,所以无法用 locate 搜索新建的文件。可以使用 updatedb 来立即更新数据库。

# locate [-ir] keyword
-r:正则表达式

4. find

文件搜索。可以使用文件的属性和权限进行搜索。

# find [basedir] [option]
example: find . -name "shadow*"

① 与时间有关的选项

-mtime  n :列出在 n 天前的那一天修改过内容的文件
-mtime +n :列出在 n 天之前 (不含 n 天本身) 修改过内容的文件
-mtime -n :列出在 n 天之内 (含 n 天本身) 修改过内容的文件
-newer file : 列出比 file 更新的文件

+4、4 和 -4 的指示的时间范围如下:

在这里插入图片描述

② 与文件拥有者和所属群组有关的选项

-uid n
-gid n
-user name
-group name
-nouser :搜索拥有者不存在 /etc/passwd 的文件
-nogroup:搜索所属群组不存在于 /etc/group 的文件

③ 与文件权限和名称有关的选项

-name filename
-size [+-]SIZE:搜寻比 SIZE 还要大 (+) 或小 (-) 的文件。这个 SIZE 的规格有:c: 代表 byte,k: 代表 1024bytes。所以,要找比 50KB 还要大的文件,就是 -size +50k
-type TYPE
-perm mode  :搜索权限等于 mode 的文件
-perm -mode :搜索权限包含 mode 的文件
-perm /mode :搜索权限包含任一 mode 的文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值