仅个人想法,会持续不间断更新和改进。
在Linux的庞大世界中,搜索犹如明灯,可以拨开云雾见青天,照亮我们前行大道路。
无论你是在浩瀚的代码库中搜索一个特定的函数,还是在庞大的文件系统中寻找一个文件,搜索命令着实是不可或缺尤为重要的工具。
而其中最绕不开的当属以下几个。
一切皆可查的 find
find
命令用来在指定目录下查找文件,功能相当之强大。
官方定义为:
find – search for files in a directory hierarchy
Linux的哲学是一切皆文件,那么find的使命就是一切皆可查。
语法
使用语法为:$ find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path…] [expression]
比较常用的几个参数为:
-exec <执行指令>
:假设find指令的回传值为True,就执行该指令;-size <文件大小>
:查找符合指定的文件大小的文件;-mtime <24小时>
:查找在指定时间曾被更改过的文件或目录,单位以24小时计算;-name<范本样式>:指定字符串作为寻找文件或目录的范本样式;-type <文件类型>
:只寻找符合指定的文件类型的文件;
无参数
如果使用该命令时,不设置任何参数,则find
命令将在当前目录下查找子目录与文件,并且将查找到的子目录和文件全部进行显示。$ ls -ltotal 310M-rw-rw-r– 1 user user 10M Mar 21 20:01 adrwxrwxr-x 2 user user 22 Mar 21 20:01 aa-rw-rw-r– 1 user user 100M Mar 21 20:01 b-rw-rw-r– 1 user user 200M Mar 21 20:01 c
$ find../a./b./c./test
查找小于,等于和大于100MB的文件
通过-size大小来查找文件$ find . -size -100M../a./aa$ find . -size 100M./b$ find . -size +100M./c./aa/d
查找多长时间修改过
可以通过参数-mtime来查找文件的修改时间,比如如下可以查找当前目录下最近60天没有被修改的文件。$ find . -mtime +60
# 最近2天以内未修改$ find . –mtime -2
稍微复杂但是很有用的命令
我经常把 find
命令和他的选项 exec
一起使用,比如我想查找一个目录中的所有文件并将其更改其权限。可以通过以下简单命令完成:$ find /path/ -type f -exec chmod 644 {} \;
这个命令会递归搜索指定目录内/path/下的所有文件,并对找到的文件执行 chmod
命令。
精准快速定位的locate
.. note::
众里寻他千百度,蓦然回首,那人却在灯火阑珊处 -李煜
Linux locate
命令用于查找符合条件的文档、程序、目录等等。这个命令会在数据库中查找符合条件的各种信息。
一般情况我们只需要输入 locate name
即可查找。
官方定义为:
locate
– list files in databases that match a pattern
使用方法为:$ locate [-d path | –database=path] [-e | -E | –[non-]existing] [-i | –ignore-case] [-0 | –null] [-c | –count] [-w | –wholename] [-b | –basename] [-l N | –limit=N] [-S | –statistics] [-r | –regex ] [–regex‐ type R] [–max-database-age D] [-P | -H | –nofollow] [-L | –follow] [–version] [-A | –all] [-p | –print] [–help] pattern…
看着很复杂,不过常用的参数倒是不多,基本为:
-n
: 至多显示 n个输出。-i, --ignore-case
: 忽略大小写
默认无参数
默认情况下,locate
直接跟上需要查找的信息就可以了,如下所示:$ locate set_vis.cpp/home/user/mycode/src/set_vis.cpp
# 以查找apropos为例$ locate apropos/usr/bin/apropos/usr/local/difmap/help/apropos.hlp/usr/share/emacs/24.3/lisp/apropos.elc/usr/share/man/de/man1/apropos.1.gz/usr/share/man/es/man1/apropos.1.gz/usr/share/man/fr/man1/apropos.1.gz/usr/share/man/id/man1/apropos.1.gz/usr/share/man/it/man1/apropos.1.gz/usr/share/man/ja/man1/apropos.1.gz/usr/share/man/man1/apropos.1.gz/usr/share/man/nl/man1/apropos.1.gz/usr/share/man/pl/man1/apropos.1.gz/usr/share/man/ru/man1/apropos.1.gz
太多需要简单化
如果输出的信息很多,仅仅希望看到前面的几个,使用-n
参数即可# 仅仅查看前的3个$ locate -n 3 apropos/usr/bin/apropos/usr/local/difmap/help/apropos.hlp/usr/share/emacs/24.3/lisp/apropos.elc
不区分大小写
部分情况下,可能有大小写混淆的情况,此时使用-i
参数既可$ $ locate -i set_vis.cpp/home/user/mycode/src/set_vis.cpp/home/user/mycode_CPP/src/set_VIS.cpp
说明
不过刚按照的系统,这个命令并不一定有输出,主要是因为locate
与 find
不同, find
直接在硬盘找,而locate
只在数据库中查找。
这个数据库在CentOS系统默认的为 /var/lib/mlocate/mlocate.db 中,所以locate
的查找会比较快,但并一定是实时的,而是以数据库的更新为准。
可以通过下面的命令手工升级数据库 ,命令为:$ updatedb
然后就可以使用了。
文件内容搜索利器 – grep
Linux grep
命令用于查找文件里符合条件的字符串。
官方定义为:
grep
,egrep
,fgrep
– print lines matching a pattern
grep支持正则表达式,是一个强大的文本搜索工具。
语法
语法也挺复杂,因为功能确实很强大。$ grep [OPTION…] PATTERNS [FILE…]$ grep [OPTION…] -e PATTERNS … [FILE…] # 使用egrep$ grep [OPTION…] -f PATTERN_FILE … [FILE…] # 使用fgrep
常用的参数为:
- -r 或 –recursive : 此参数的效果和指定”-d recurse”参数相同
- -v 或 –invert-match : 显示不包含匹配文本的所有行
- -i 或 –ignore-case : 忽略字符大小写的差别
- -n 或 –line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
假定有如下3个文件,1个文件夹,内容如下:a This is a Hello a b this is b Hello bc This is c Hello c
d/d This is d Hello d
默认无参数
在当前目录搜索包含is字符串,可以看到a/b/c三个文件均有输出,而d因为是目录,暂时无输出。$ grep is *a:This is ab:this is bc:This is cgrep: d: Is a directory
增加文件夹
与其他命令类似,增加-r
参数,递归搜索$ grep -r is *a:This is ab:this is bc:This is cd/d:This is d
反向查找
在某些情况下,或许正想找到不包含某些字符串的内容,如下:$ grep -rv is *a:Hello ab:Hello bc:Hello cd/d:Hello d
此时可以看到,不包含is的内容显示了出来。
不区分大小写
而某些情况下,或许我们希望找到不区分大小写的内容,比如对于This/this而言:$ grep -r This *a:This is ac:This is cd/d:This is d
$ grep -ri This *a:This is ab:this is bc:This is cd/d:This is d
可以看到此时有可能笔误,或者其他原因的b文件已经被找到了。
显示行数,精准定位
如果文件内容比较多,此时显示内容在哪一行,是很重要的,加上-n
参数既可解决。$ grep -rn This *a:1:This is ac:1:This is cd/d:1:This is d
声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/389367.html