linux判断文件名是否结尾,Linux操作系统--文件查看(八)

1. head命令:显示文件开头的内容

head 是用来显示文件开头的命令,其基本信息如下。

命令名称:head。

英文原意:output the first part of files。

所在路径:/usr/bin/head。

执行权限:所有用户。

功能描述:显示文件开头的内容。

命令格式

[root@localhost ~]# head [选项]文件名

选项:

-n 行数: 从文件头开始,显示指定行数;

-v:显示文件名;

常见用法

[root@localhost ~]# head anaconda-ks.cfg

head 命令默认显示文件的开头 10 行内容。如果想显示指定的行数,则只需使用"-n"选项即可,例如:

[root@localhost ~]# head -n 20 anaconda-ks.cfg

这是显示文件的开头 20 行内容,也可以直接写"-行数",例如:

[root@localhost ~]# head -20 anaconda-ks.cfg

2. tail命令:显示文件结尾的内容

既然有显示文件开头的命令,就会有显示文件结尾的命令——tail 命令。

tail 命令的基本信息如下:

命令名称:tail。

英文原意:output the last part of files。

所在路径:/usr/bin/tail。

执行权限:所有用户。

功能描述:显示文件结尾的内容。

命令格式

[root@localhost ~]#tail [选项] 文件名

选项:

-n 行数:从文條尾开始,显示指定行数

-f:监听文件的新増内容

常见用法

【例 1】基本用法。

[root@localhost ~]# tail anaconda-ks.cfg

tail 命令和 head 命令的格式基本一致,默认会显示文件的后 10 行。如果想显示指定的行数,则只需使用"-n"选项即可,例如:

[root@localhost ~]# tail -n 20 anaconda-ks.cfg

也可直接写"-行数",例如:

[root@localhost ~]# tail -20 anaconda-ks.cfg

【例 2】 监听文件的新増内容。

tail 命令有一种比较有趣的用法,可以使用"-f"选项来监听文件的新増内容,例如:

[root@localhost ~]#tail -f anaconda-ks.cfg

@server-platform

@server-policy

pax

oddjob

sgpio

certmonger

pam_krb5

krb5-workstation

perl-DBD-SQLite

%end

#光标不会退出文件,而会一直监听在文件的结尾处

这条命令会显示文件的最后 10 行内容,而且光标不会退出命令,而会一直监听文件的结尾处,等待显示新増内容。这时如果向文件中追加一些数据(需要开启一个新终端),那么结果如下:

[root@localhost ~]# echo 2222222222 >> anaconda-ks.cfg

[root@localhost ~]# echo 3333333333 >> anaconda-ks.cfg

#在新终端中通过echo命令向文件中追加数据

在原始的正在监听的终端中,会看到如下信息:

[root@localhost ~]# tail -f anaconda-ks.cfg @server-platforin

@server-policy

pax

oddjob

sgpio

certmonger

pam_krb5

krb5-workstation

perl-DBD-SQLite

%end2222222222

33333333333

#在文件的结尾处监听到了新増数据

3. ln命令:在文件之间建立链接(硬链接和软链接)

如果要想说清楚 ln 命令,则必须先解释下 ext 文件系统是如何工作的。我们在前面讲解了分区的格式化就是写入文件系统,而我们的 Linux 目前使用的是 ext4 文件系统。如果用一张示意图来描述 ext4 文件系统。

c2752be4489a

image.png

ext4 文件系统会把分区主要分为两大部分(暂时不提超级块):小部分用于保存文件的 inode (i 节点)信息;剩余的大部分用于保存 block 信息。

inode 的默认大小为 128 Byte,用来记录文件的权限(r、w、x)、文件的所有者和属组、文件的大小、文件的状态改变时间(ctime)、文件的最近一次读取时间(atime)、文件的最近一次修改时间(mtime)、文件的数据真正保存的 block 编号。每个文件需要占用一个 inode。大家如果仔细查看,就会发现 inode 中是不记录文件名的,那是因为文件名记录在文件所在目录的 block 中。

block 的大小可以是 1KB、2KB、4KB,默认为 4KB。block 用于实际的数据存储,如果一个 block 放不下数据,则可以占用多个 block。例如,有一个 10KB 的文件需要存储,则会占用 3 个 block,虽然最后一个 block 不能占满,但也不能再放入其他文件的数据。这 3 个 block 有可能是连续的,也有可能是分散的。

ln命令格式

了解了 ext 文件系统的概念,我们来看看 ln 命令的基本信息。

命令名称:ln。

英文原意:make links between file0

所在路径:/bin/ln。

执行权限:所有用户。

功能描述:在文件之间建立链接。

ln 命令的基本格式如下:

[root@localhost ~]# ln [选项] 源文件 目标文件

选项:

-s:建立软链接文件。如果不加"-s"选项,则建立硬链接文件;

-f:强制。如果目标文件已经存在,则删除目标文件后再建立链接文件;

如果创建硬链接:

[root@localhost ~]# touch cangls

[root@localhost ~]# ln /root/cangls /tmp/

#建立硬链接文件,目标文件没有写文件名,会和原名一致

#也就是 /root/cangls 和 /tmp/cangls 是硬链接文件

如果创建软链接:

[root@localhost ~]# touch bols

[root@localhost ~]# In /root/bols /tmp/

#建立软链接文件

math?formula=%5Ccolor%7Bred%7D%7B%E8%BF%99%E9%87%8C%E9%9C%80%E8%A6%81%E6%B3%A8%E6%84%8F%EF%BC%8C%E8%BD%AF%E9%93%BE%E6%8E%A5%E6%96%87%E4%BB%B6%E7%9A%84%E6%BA%90%E6%96%87%E4%BB%B6%E5%BF%85%E9%A1%BB%E5%86%99%E6%88%90%E7%BB%9D%E5%AF%B9%E8%B7%AF%E5%BE%84%EF%BC%8C%E8%80%8C%E4%B8%8D%E8%83%BD%E5%86%99%E6%88%90%E7%9B%B8%E5%AF%B9%E8%B7%AF%E5%BE%84%EF%BC%88%E7%A1%AC%E9%93%BE%E6%8E%A5%E6%B2%A1%E6%9C%89%E8%BF%99%E6%A0%B7%E7%9A%84%E8%A6%81%E6%B1%82%EF%BC%89%EF%BC%9B%E5%90%A6%E5%88%99%E8%BD%AF%E9%93%BE%E6%8E%A5%E6%96%87%E4%BB%B6%E4%BC%9A%E6%8A%A5%E9%94%99%E3%80%82%E8%BF%99%E6%98%AF%E5%88%9D%E5%AD%A6%E8%80%85%E9%9D%9E%E5%B8%B8%E5%AE%B9%E6%98%93%E7%8A%AF%E7%9A%84%E9%94%99%E8%AF%AF%E3%80%82%7D

建立硬链接和软链接非常简单,那这两种链接有什么区别?

它们都有什么作用?这才是链接文件最不容易理解的地方,我们分别来讲讲。

硬链接

我们再来建立一个硬链接文件,然后看看这两个文件的特点。

[root@localhost ~]# touch test

#建立源文件

[root@localhost ~]# ln /root/test /tmp/test-hard

#给源文件建立硬链接文件 /tmp/test-hard

[root@localhost ~]# ll -i /root/test /tmp/test-hard

262147 -rw-r--r-- 2 root root 0 6月 19 10:06 /root/test

hard

262147 -rw-r--r-- 2 root root 0 6月 19 10:06 /tmp/test-hard

#查看两个文件的详细信息,可以发现这两个文件的 inode 号是一样的,"ll"等同于"ls -l"。

这里有一件很奇怪的事情,我们之前在讲 inode 号的时候说过,每个文件的 inode 号都应该是不一样的。inode 号就相当于文件 ID,我们在查找文件的时候,要先查找 inode 号,才能读取到文件的内容。

但是这里源文件和硬链接文件的 inode 号居然是一样的,那我们在查找文件的时候,到底找到的是哪一个文件呢?

c2752be4489a

image.png

在 inode 信息中,是不会记录文件名称的,而是把文件名记录在上级目录的 block 中。也就是说,目录的 block 中记录的是这个目录下所有一级子文件和子目录的文件名及 inode 的对应;而文件的 block 中记录的才是文件实际的数据。

当我们查找一个文件,比如 /root/test 时,要经过以下步骤:

首先找到根目录的 inode(根目录的 inode 是系统已知的,inode 号是 2),然后判断用户是否有权限访问根目录的 block。

如果有权限,则可以在根目录的 block 中访问到 /root 的文件名及对应的 inode 号。

通过 /root/ 目录的 inode 号,可以查找到 /root/ 目录的 inode 信息,接着判断用户是否有权限访问 /root/ 目录的 block。

如果有权限,则可以从 /root/ 目录的 block 中读取到 test 文件的文件名及对应的 inode 号。

通过 test 文件的 inode 号,就可以找到 test 文件的 inode 信息,接着判断用户是否有权限访问 test 文件的 block。

如果有权限,则可以读取 block 中的数据,这样就完成了 /root/test 文件的读取与访问。

按照这个步骤,在给源文件 /root/test 建立了硬链接文件 /tmp/test-hard 之后,在 /root/ 目录和 /tmp/ 目录的 block 中就会建立 test 和 test-hard 的信息,这个信息主要就是文件名和对应的 inode 号。但是我们会发现 test 和 test-hard 的 inode 信息居然是一样的,那么,我们无论访问哪个文件,最终都会访问 inode 号是 262147 的文件信息。

这就是硬链接的原理。硬链接的特点如下:

不论是修改源文件(test 文件),还是修改硬链接文件(test-hard 文件),另一个文件中的数据都会发生改变。

不论是删除源文件,还是删除硬链接文件,只要还有一个文件存在,这个文件(inode 号是 262147 的文件)都可以被访问。

硬链接不会建立新的 inode 信息,也不会更改 inode 的总数。

硬链接不能跨文件系统(分区)建立,因为在不同的文件系统中,inode 号是重新计算的。

硬链接不能链接目录,因为如果给目录建立硬链接,那么不仅目录本身需要重新建立,目录下所有的子文件,包括子目录中的所有子文件都需要建立硬链接,这对当前的 Linux 来讲过于复杂。

硬链接的限制比较多,既不能跨文件系统,也不能链接目录,而且源文件和硬链接文件之间除 inode 号是一样的之外,没有其他明显的特征。这些特征都使得硬链接并不常用,有所了解就好。

[root@localhost ~]# echo 1111 >>/root/test

#向源文件中写入数据

[root@localhost ~]# cat /root/test

1111

[root@localhost ~]# cat /tmp/test-hard

1111

#源文件和硬链接文件都会发生改变

[root@localhost ~]# echo 2222 >> /tmp/test-hard

#向硬链接文件中写入数据

[root@localhost ~]# cat /root/test

1111

2222

[root@localhost ~】# cat /tmp/test-hard

1111

2222

#源文件和硬链接文件也都会发生改变

[root@localhost ~]# rm -rf/root/test

#删除源文件

[root@localhost ~]# cat /tmp/test-hard

1111 2222

#硬链接文件依然可常读取

软链接

软链接也称作符号链接,相比硬链接来讲,软链接就要常用多了。我们先建立一个软链接,再来看看软链接的特点。

[root@localhost ~]# touch check

#建立源文件

[root@localhost ~]# ln -s /root/check /tmp/check-soft

#建立软链接文件

[root@localhost ~]# ll -id /root/check /tmp/check-soft

262154 -rw-r--r-- 1 root root 0 6月 19 11:30 /root/check

917507 lrwxrwxrwx 1 root root 11 6月 19 11:31 /tmp/ check-soft -> /root/check

#软链接和源文件的 inode 号不一致,软链接通过 -> 明显地标识出源文件的位置

#在软链接的权限位 lrwxrwxrwx 中,l 就代表软链接文件

再强调一下,软链接的源文件必须写绝对路径,否则建立的软链接文件就会报错,无法正常使用。

软链接的标志非常明显,首先,权限位中"l"表示这是一个软链接文件;其次,在文件的后面通过 "->" 显示出源文件的完整名字。所以软链接比硬链接的标志要明显得多,而且软链接也不像硬链接的限制那样多,比如软链接可以链接目录,也可以跨分区来建立软链接。

软链接完全可以当作 Windows 的快捷方式来对待,它的特点和快捷方式一样,我们更推荐大家使用软链接,而不是硬链接。

大家在学习软链接的时候会有一些疑问:Windows 的快捷方式是由于源文件放置的位置过深,不容易找到,建立一个快捷方式放在桌面,方便查找,那 Linux 的软链接的作用是什么呢?

软链接主要是为了照顾管理员的使用习惯。比如,有些系统的自启动文件 /etc/rc.local 放置在 /etc/ 目录中,而有些系统却将其放置在 /etc/rc.d/rc.local 中,那么干脆对这两个文件建立软链接,不论你习惯操作哪一个文件,结果都是一样的。

如果你比较细心,则应该已经发现软链接和源文件的 inode 号是不一致的,我们也画一张示意图来看看软链接的原理:

c2752be4489a

image.png

软链接和硬链接在原理上最主要的不同在于:硬链接不会建立自己的 inode 索引和 block(数据块),而是直接指向源文件的 inode 信息和 block,所以硬链接和源文件的 inode 号是一致的;而软链接会真正建立自己的 inode 索引和 block,所以软链接和源文件的 inode 号是不一致的,而且在软链接的 block 中,写的不是真正的数据,而仅仅是源文件的文件名及 inode 号。

我们来看看访问软链接的步骤和访问硬链接的步骤有什么不同。

首先找到根目录的 inode 索引信息,然后判断用户是否有权限访问根目录的 block。

如果有权限访问根目录的 block,就会在 block 中查找到 /tmp/ 目录的 inode 号。

接着访问 /tmp/ 目录的 inode 信息,判断用户是否有权限访问 /tmp/ 目录的 block。

如果有权限,就会在 block 中读取到软链接文件 check-soft 的 inode 号。因为软链接文件会真正建立自己的 inode 索引和 block,所以软链接文件和源文件的 inode 号是不一样的。

通过软链接文件的 inode 号,找到了 check-soft 文件 inode 信息,判断用户是否有权限访问 block。

如果有权限,就会发现 check-soft 文件的 block 中没有实际数据,仅有源文件 check 的 inode 号。

接着通过源文件的 inode 号,访问到源文件 check 的 inode 信息,判断用户是否有权限访问 block。

如果有权限,就会在 check 文件的 block 中读取到真正的数据,从而完成数据访问。

通过这个过程,我们就可以总结出软链接的特点(软链接的特点和 Windows 中的快捷方式完全一致)。

不论是修改源文件(check),还是修改硬链接文件(check-soft),另一个文件中的数据都会发生改变。

删除软链接文件,源文件不受影响。而删除原文件,软链接文件将找不到实际的数据,从而显示文件不存在。

软链接会新建自己的 inode 信息和 block,只是在 block 中不存储实际文件数据,而存储的是源文件的文件名及 inode 号。

软链接可以链接目录。

软链接可以跨分区。

[root@localhost ~]# echo 111>>/root/check

#修改源文件

[root@localhost ~]# cat /root/check

111

[root@localhost ~]# cat /tmp/check-soft

111

#不论是源文件还是软链接文件,数据都发生改变

[root@localhost ~]# echo 2222 >>/tmp/check-soft

#修改软链接文件

[root@localhost ~]# cat /tmp/check-soft

111

2222

[root@localhost ~]# cat /root/check

111

2222

#不论是源文件还是软链接文件,数据也都会发生改变

[root@localhost ~]# rm -rf/root/check

#删除源文件

[root@localhost ~]# cat /tmp/check-soft

cat: /tmp/check-soft:没有那个文件或目录

#软链接无法正常使用

软链接是可以链接目录的,例如:

[root@localhost ~]# mkdir test

#建立源目录

[root@localhost ~]# ln -s /root/test/ /tmp/

[root@localhost ~]# ll -d /tmp/test

lrwxrwxrwx 1 root root 11 6月 19 12:43 /tmp/test->/root/test/

#软链接可以链接目录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值