第六讲:Linux文件查找

admin 提交于 周一, 10/19/2020 - 11:49

grep是Linux命令行下常用于查找过滤文本文件内容的命令。最简单的用法是:

grep apple fruitlist.txt

如果想忽略大小写,可以用-i参数:

grep -i apple fruitlist.txt

如果想搜索目录里所有文件,包括子目录的话,并且在结果中显示行号,可以用以下命令:

grep -nr apple *

Linux搜索文件的命令是find。直接输入`find`回车,会显示当前目录及子目录的所有文件列表。下面一条命令是搜索当前目录以下以g开头的文件:

find -name "g*"

如果想忽略大小写,可以增加参数i,写成:

find -iname "g*"

下面一条命令可以搜索/etc目录以下,60分钟内修改过得文件:

find /etc -cmin -60

下面一条命令在当前目录搜索所有文件,不包括目录文件,仅搜索一层目录(即当前目录),找到后对文件执行`file`命令查看其文件类型。需要说明的是,'{}'代表搜索到的文件名,作为file命令的参数。末尾的\;则表示命令结束。

find . -type f -maxdepth 1 -exec file '{}' \;

搜索文件后调用另外一个命令来处理文件是一个很有用的功能,这个功能除了可以用find的exec参数实现外,还可以通过管道操作和xargs命令实现。并且xargs的方式不需要添加末尾的“\;”,可能更好记忆。

find . -maxdepth 1 | xargs file

再举一个管道操作和xargs命令的使用例子。假设我们一堆需要删除的文件路径写在了一个文本文件filelist里,一行一个路径。那么下面命令可以把这些文件删除掉:

cat filelist | xargs rm -rf

find命令搜索是比较慢的,尽量不要在根目录运行这个命令,那样会搜索整个硬盘。如果想在整个硬盘搜索文件,locate命令更适合。使用locate命令之前,我们需要先更新文件路径数据库:

sudo updatedb

注意,updatedb是需要root超级用户权限的,所以需要加sudo前缀,sudo是super user do的意思。更新的操作可能要几分钟时间,但不需要每一次都做,只有当你觉得距离上一次更新操作,有很多文件位置已经发生变化才需要再更新。完成更新后我们可以通过`locate 文件名关键词`来快速搜索一个文件。

find和locate命令的更多用法请查看man命令。

 

grep的语法支持正则表达式,正则表达式有些复杂,以后再讲解。下面是一些有用的参数:

  • -A num, --after-context=num: 在结果中同时输出匹配行之后的num行
  • -B num, --before-context=num: 在结果中同时输出匹配行之前的num行,有时候我们需要显示几行上下文。
  • -i, --ignore-case: 忽略大小写
  • -n, --line-number: 显示行号
  • -R, -r, --recursive: 递归搜索子目录
  • -v, --invert-match: 输出没有匹配的行

我们可以通过管道操作来让grep变得更强大,管道操作就是把前面一条命令的输出作为后面一条命令的输入,从而把很多简单的命令组合起来完成复杂的功能。例如,如果我们想查找包含apple的行,但又想过滤掉pineapple,可以用下面的命令:

grep apple fruitlist.txt | grep -v pineapple

如果我们想把搜索结果保存起来,那么可以把命令的标准输出重定向到文件:

grep apple fruitlist.txt | grep -v pineapple > apples.txt

重定向符号>和管道操作符号|的区别是,重定向后面接的是一个文件,它后面不能再接任何文件或命令了;而管道操作后面接的是命令,可以无限地接下去。如果想以追加方式写到文件,可以用>>。管道操作是Linux命令行的一种哲学,它是计算机技术中少有的能沿用几十年的技术之一。通过管道操作,一行命令可以完成Windows下上千行程序也不能完成的文本处理功能。

添加新评论

Restricted HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id> <img src>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。
验证码
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.
请输入"汉语"