欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

linux文件搜索命令

1.查找执行文件(which/whereis)

  • which用于从系统的PATH变量所定义的目录中查找可执行文件的绝对路径。比如说想查找passwd这个命令在系统中的绝对路径,使用方法如下:

[root@localhost ~]# which passwd
/usr/bin/passwd
  • 使用whereis也能查到其路径,但是和which不同的是,它不但能找出其二进制文件,还能找出相关的man文件

2.locate与slocate

locate命令能够在文件、程序和目录中查找与提供的搜索项匹配的内容,并把任何匹配的结果依次显示到终端界面上。

locate命令并没有对系统进行实时搜索。实际上,它搜索的是每天自动更新的文件名数据库。因为locate搜索的是早已创建好的数据库,所以搜索结果几乎能够瞬间显示出来。

slocate(代表secure locate)命令的版本更新些,它不会搜索运行slocate命令的用户没有权限查看的目录(例如,如果你不是root用户,那么当用locate搜索时,就不会显示/root目录中的结果)。

因为Linux系统默认是区分大小写的。明确这一点以后,可以加上-i选项,这样执行的就是不区分大小写的搜索,从而既可以找到路径中包含haggard的文件,也可以找到包含Haggard的文件(实际上,也包括HAGGARD、HaGgArD等)。

locate -i haggard

如果只想看前面的x个结果(x是你选择的一个整数),则可以使用-n选项,后面跟着你想要看的结果个数。

locate -n 3 pdf

updatedb

locate命令依赖于一个数据库文件,Linux系统默认每天会检索一下系统中的所有文件,然后将检索到的文件记录到数据库中。在运行locate命令的时候可直接到数据库中查找记录并打印到屏幕上,所以使用locate命令要比find命令反馈更为迅速。在执行这个命令之前一般需要执行updatedb命令(这不是必须的,因为系统每天会自动检索并更新数据库信息,但是有时候会因为文件发生了变化而系统还没有再次更新而无法找到实际上确实存在的文件。所以有时需要主动运行该命令,以创建最新的文件列表数据库),以及时更新数据库记录。下面是使用locate命令来查找httpd.conf文件:

[root@localhost ~]# updatedb
[root@localhost ~]# locate httpd.conf
/etc/httpd/conf/httpd.conf

在任何时候都能够通过运行updatedb,手动更新locate使用的数据库。因为这个命令基本上会为计算机上的每个文件和文件夹编制索引

但这里应该注意一件事:updatedb运行的速度与硬盘中资料的数量以及计算机的处理速度有直接关系。处理器的速度越快、硬盘的速度越快、文件越少,updatedb也就运行得越快。如果CPU很慢,硬盘的转速才有5400RPM,而且还有100万个文件,那就别指望updatedb能快到哪去。如果想知道updatedb的运行花费了多长时间,可以在updatedb前面加上time命令,如下所示:

# time updatedb

在updatedb处理完成以后,time命令就能显示整理好locate数据库花费了多长时间。这个信息很有用,需要记住,可能以后会需要使用updatedb而时间又很紧。

3.find

虽然locate命令搜索文件的数据库,使得它的运行速度很快,但要依赖不断更新的数据库;而find命令则可以根据指定的查询条件,轻松地对文件进行搜索。。由于find命令必须分析文件的结构,所以它的速度比locate命令要慢很多,然而可以用find命令完成很多用locate命令无法实现的功能。

在默认情况下,find会自动递归搜索整个目录结构。要在music盘中查找唯一的Shaggs组下的所有MP3文件,如下所示:

$ cd /media/music
$ find . -name Shaggs

需要使用通配符,但为了防止shell以我们不期望的方式解释通配符,就必须用引号把搜索内容括起来。下面就用新改进后的方法再搜索一下:

find . -name "*Shaggs*"

find命令的另一重要方面是,搜索结果的格式取决于正在搜索的路径。前面使用的是相对路径,所以结果也是按相对路径给出。如果使用绝对路径(以/作为路径的开始),会发生什么呢?

$ find / -name "*Shaggs*"
/music/Outsider/Shaggs

按用户/用户组搜索

想在music盘中搜索scott拥有的文件吗?使用find命令和-user选项,后面输入用户名(或用户编号,在/etc/passwd中可以找到),如下所示:

find . -user scott

查找拥有者不是scott的文件,可能更容易,只要在想取反的选项前面加一个叹号(!)就可以了。

find . ! -user scott

如果想搜索特定用户组拥有的文件,只需使用-group选项,后面输入组的名称或编号。在music盘中,scott应该是拥有者,music则是它属于的用户组。让我们来看看是否有文件不属于music组,如下所示:

$ find . ! -group music

按大小搜索

如果要搜索的文件大小大于10MB,需要在指定的大小前面加一个加号(+);如果要搜索的文件大小小于10MB,则需要在大小前面加一个减号(-),如下所示:

find . -size +10M

如果要搜索大型文本文件,可以在数字后面使用c。c将搜索的大小单位修改成字节。在文本文件中一个字符就是一个字节,所以记住选项c的一种简单办法就是,把它与文本文件中的“字符(character)”联系起来记忆。例如,为搜索大文本文件,可以使用以下代码:

find /home/scott/documents -size +500000c

4.查找文件里的内容

要搜索文件内容,应该使用grep命令。grep的处理过程基本上就是,为它提供一个搜索想要匹配的模式,指定要搜索的一个或一组文件(甚至是整个硬盘空间),然后grep就会输出能够与搜索模式匹配的各行内容的列表。

通配符

通配符不等于正则表达式。虽然通配符和正则表达式都使用星号()字符,但它们的含义完全不同。通配符中使用特定的字符(如?和)表示替换(substitution),而正则表达式中同样的字符表示要对前面的内容进行匹配的次数。例如,在通配符中,可以把c?t中的?替换成另一个字符,而且只能替换一次,所以这个通配符可以匹配cat、cot和cut,但不能与ct匹配。在正则表达式中,c[a-z]?t中的?表示从字母A到Z都可以匹配,但只可以匹配0次或1次,所以这个正则表达式可以匹配cat、cot、cut,也可以匹配ct。

正则表达式中的单引号和双引号的用法也有很大区别。单引号('和')是在告诉shell正在搜索一个字符串,而双引号("和")则是让shell知道想要使用shell变量。

grep 'hey!' *

结果好多了。单引号告诉grep搜索内容不包含任何shell变量,只是一串需要匹配的字符。你瞧,现在只有一个结果,正是你要找的那个。

递归式地搜索文件中的文本

grep -R hideous *
grep -R hideous *| less

忽略大小写

grep -i hideous h_p_lovecraft/*

精确匹配

如果只需要精确匹配pain的行,又该怎么办呢?这时就要使用-w(或--word-regexp)选项。

grep -w pain *

查找行号

要找到行号,可以利用-n(或--line-number)选项。$ grep -n pain *

根据进程用户查找

ps命令可以列出运行中的进程,而-f选项能够让ps提供完整的列表,其中包括每个进程的很多信息;而-U选项,后面跟上用户名称,可以限制只输出那个用户拥有的进程。

ps -fU scott | grep firefox

查看文件中搜索内容的上下文信息

使用-B(或--before-context=#)选项,就可以得到答案。如下所示:

ls -1 | grep -B 3 A_Love_Supreme

如果要找出A Love Supreme之后的唱片,则应该使用-A(或--after-context=#)选项。如下所示:

ls -1 | grep -A 3

要得到A Love Supreme专辑的完整历史背景,则可以试试-C(或--context=#)选项,它可以把该专辑之前和之后的内容都组合在一起。

ls -1 | grep -C 2

如果结合-n选项,结果中的信息将更有用,该选项可以列出行号(因为这里使用的是ls -1,所以它是ls结果列表中的行号)。

ls -1 | grep -n -C 1 Live

反向匹配

使用-v(或--invert-match)选项,就可以只显示与给定模式不匹配的结果了。使用-v选项,确实能够对结果进行过滤,只精确显示需要的内容。

ls -1 | grep -v Led_Zeppelin

列出这些行所在的文件

用-l(或--files-with-matches)选项,就能够只列出这些行所在的文件(记住,-i选项用于让搜索不区分大小写)。

grep -il hideous h_p_lovecraft/*

来自 https://segmentfault.com/a/1190000007555389
普通分类: