山地人

Linux中搜索定位文件

山地人
山地人
2021-05-17

通过前两篇的学习,我们已经掌握的如何在Linux系统里查看管理文件的基本命令,这一篇我们将目光聚焦在如何搜索定位文件上。

搜索文件

在Windows这种图形化界面中,我们已经很熟悉搜索功能,但来到Linux中,我们需要通过命令来帮助我们完成搜索的功能。

find是一个快速查找文件名的工具。通过命令的名称你就能知道这个工具是做搜索用的。使用方法也非常简单

find search_path -name filename
  • search_path 为指定的搜索路径
  • -name 后面指定的搜索的文件名称

动动手

比如:想要搜索所有以a开头的文件名

cd home
touch abc.txt
touch hello.txt
touch main.txt

启动终端,按照上面的步骤在home目录创建几个测试文件。

然后使用下面的命令进行搜索。

find . -name a*

你会获得下面的结果,find命令匹配除了正确的结果,只有abc.txt符合我们本次的搜索要求。

# find . -name a*
./abc.txt

当然,find命令的功能非常强大,还有很多搜索参数可以使用。

find命令的参数含义
-type指定搜索的文件类型:d目录文件,b块设备,c字符设备,l符号链接
-size指定文件大小:n(单位k
-empty只搜索空的文件或空目录
-ctime指定搜索创建时间在n小时前创建的文件
# 搜索/home目录下 .js 结尾的文件
find /home -name *.js
# 搜索当前目录下的空目录
find . -type d -empty
# 搜索当前目录下,1小时前创建的文件
find . -ctime 1

启动终端,测试上面这些示例,你也可以根据上面给出的一些常用参数,测试自己定义的规则。

指定文件内查找

find命令是用来进行指定路径下的文件搜索,如果要在指定文件中进行全文搜索,我们就要用到grep命令了。grep命令在文件内的搜索能力是非常强的。

下面是grep命令的一个基本用法。

grep patterns file
  • patterns 是指定搜索的模式
  • file 是指定要搜索的文件

动动手

1.创建一个待搜索的文本

echo -e "abcdef hello \nhello\nworld\good" > test.txt

(echo命令后面的-e是为了让字符串中的\n换行符的作用生效,生成多行字符串文本)

2.查看文件内容

cat test.txt

3.使用grep搜索test.txt中包含a的文本行

grep a test.txt

打开终端,进行上面的实验。

查看文件

我们前面已经学过了一种查看文件内容的方式:cat,但是对于大型文件,比如大型的日志文件,我们通常不会直接使用cat命令来查看。否则只能看到满屏的字符。

那是否有只查看文件部分内容的命令呢,当然,你想到的Linux的早期用户都考虑到了,这就是headtail命令。

这两个命令,从字面意思就能看出,head是查看文件头部,而tail则是查看文件结尾的。

head test.txt
tail test.txt

打开终端,先构建一个测试文件,然后分别用headtail来查看这个文件。

echo -e "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\na\nb\nc\nd\ne\nf" > test.txt

上面是我为你准备的测试文件,你可以直接拿来使用。

(echo命令后面的-e是为了让字符串中的\n换行符的作用生效,生成多行字符串文本)

如果你想查看指定行数的文本,可以用-n指定要查看的行数。

head -n 5 test.txt
tail -n 5 test.txt

打开终端,分别用headtail来查看test.txt文件中的前5行和结尾的5行内容。

比较文件差异

有时候,我们需要对比两个文件的差异,在Windows中你可能需要安装一个专门的应用来处理这个问题。而在Linux中,diff命令就是一个天然专门针对文件差异进行比较的工具。

diff: different 的缩写,会一行一行对比两个文件的差异。

diff fileA fileB
  • 其中的fileAfileB是要进行差异化比较的两个文件的路径。

在下面的终端中放置了两个要进行比对差异的文件:a.txtb.txt。 你可以使用cat a.txtcat b.txt来查看这两个文件。

使用diff a.txt b.txt来查看两个文件的差异

当然diff还提供了彩色显示模式,diff --color a.txt b.txt

运行上面的命令后,你会得到这样的结果,我们来分析下这个结果的含义。

/home# diff --color a.txt b.txt
1,3c1,2
< Hello World
< ABCDEFG
< hello
---
> hello WORLD
> abcDEF
5d3
< 1111
6a5
> aaaa
  • 1,3c1,2 比对的第一行在字母c的左右两侧的数字分别表示前后两个比较文件的对应行。
    • 左侧的1,3表示a.txt文件的1-3行c右侧的1,2表示b.txt文件的1,2两行
    • 中间的c表示change,也就是a.txt的前三行内容变化b.txt的前两行内容。
    • 接下来的几行内容展示的就是前后变化。

      <开头的行表示左侧的a.txt文件内容,>开头的行表示右侧的b.txt文件内容。---为前后分界线。

      < Hello World
      < ABCDEFG
      < hello
      ---
      hello WORLD
      abcDEF
  • 中间的字母除了c(change改变),还有a(append增加)和d(delete删除)。
    • 5d3表示a.txt中的第5行b.txt文件中第3行的位置被删除了。

      所以这次只有左侧的1111,右侧此行内容被删除了。

    • 6a5表示a.txt第6行增加a(append)了一行内容,增加的内容为b.txt中的第5行

      所以这次只有右侧有aaaa,为新增内容。

掌握这种规则后,以后再进行文件比对时,就能理解diff规则了。

另外,还可以使用-y参数,让文件以左右两列的显示方式来展示差异。

diff -y a.txt b.txt

这种比对方式非常直观,你可以在下面的终端中测试。

这里需要明白几个符号的含义:|表示改变的内容,<表示只有左侧有的内容,>则表示只有右侧有的内容。

小结

下面我们把这节课学过的知识点再来回顾一下:

命令解释
find在指定路径搜索符合条件的文件
grep在指定文件中搜索匹配的文本行
head从文件头部输出部分文件内容
tail从文件尾部输出部分文件内容
diff按行比对文件之间的差异

至此,本篇教程也到了该和你说再见的时候了,我们下期再见。

学完本篇互动教程,如果你觉得体验不错,可以把网页链接发送给你的小伙伴,让他/她也来感受一下。当然,你也可以继续看看网站上其他的的互动教程,希望`idev365`能够给你带来收获。

学习教程的过程中碰到了问题,或者对idev365有什么改进意见和想法,欢迎加入idev365微信内测群,和山地人交流你的想法。