如何使用Linux的所有搜索命令

Linux提供了六种不同的搜索方式,每种方式都有其优点。我们将演示如何使用Find、Locate、What、Where is、Whatis和Alpropos。每个人都擅长不同的任务;以下是如何为工作选择合适的工具。

在Linux中搜索和查找命令时,您的选择太多了。为什么这么多?嗯,他们每个人都有自己的特长,在某些情况下表现得比其他人更好。你可以把它们想象成一把用于搜索的瑞士军刀。我们将依次查看每一款刀片,找出其独特的优势。

查找命令

FIND命令的行为很难通过试错来确定。一旦您理解了语法,您就会开始欣赏它的灵活性和强大功能。

使用find的最简单方法是键入find,然后按Enter键。

find

以这种方式使用find的行为类似于ls,但是它列出了当前目录和子目录中的所有文件。

Find的某些实现要求您将。用于当前目录。如果您的Linux版本是这种情况,请使用以下命令:

find .

要让find从根文件夹进行搜索,您可以使用以下命令:

find /

要从您的主文件夹开始搜索,请使用以下命令:

find ~

对文件模式使用查找

要使find不仅仅是ls的自动递归版本,我们必须为其提供搜索内容。我们可以提供文件名或文件模式。模式使用通配符,其中*表示任意字符串,而?表示任何单个字符。

模式必须加引号才能正常工作。很容易忘记这样做,但是如果不引用通配符模式,find将无法正确执行您给它的命令。

使用此命令,我们将在当前文件夹中搜索与模式“*.*s”匹配的文件。这表示文件扩展名以“s”结尾的任何文件名。我们使用-name选项告诉find,我们要么传入了文件名,要么传入了文件名模式。

find . -name "*.*s"

查找将返回这些匹配的文件。

请注意,其中两个文件扩展名的长度为两个字符,一个文件扩展名的长度为三个字符。这是因为我们使用了模式“*.*s”。如果我们只需要两个字符的文件扩展名,我们就会使用“*.?s”。

如果我们事先知道我们正在寻找JavaScript“.js”文件,我们可以在我们的文件模式中更具体。另外,请注意,如果您愿意,可以使用单引号对模式进行换行。

find . -name '*.js'

这次只找到关于JavaScript文件的报告。

使用FIND忽略案例

如果您知道要Find查找的文件的名称,则可以将其传递给Find,而不是传递给模式。如果文件名中没有通配符,则不需要用引号将其括起来,但最好始终这样做。这样做意味着您不会忘记在需要的时候使用它们。

find . -name 'Yelp.js'

什么都没还。但奇怪的是,我们知道那份文件一定在那里。我们再试一次,告诉find忽略大小写。为此,我们使用-iname选项(忽略案例名称)

find. -iname 'Yelp.js'

这就是问题所在,文件名以小写“y”开头,而我们搜索时使用的是大写“Y”。

使用Find递归子目录

find的一个伟大之处在于它递归搜索子目录的方式。让我们搜索所有以“map”开头的文件。

find . -name "map*.*"

将列出匹配的文件。请注意,它们都在一个子目录中。

使用查找功能搜索目录

-path选项使find查找目录。让我们查找一个我们不太记得其名称的目录,但我们知道它以字母“About”结尾。

find . -path '*about'

找到该目录,它只称为“about”,并且它嵌套在当前目录中的另一个目录中。

有一个-ipath(忽略大小写路径)选项,允许您搜索路径并忽略大小写,类似于上面讨论的-iname选项。

将文件属性用于查找

查找可以查找具有与搜索线索匹配的属性的文件。例如,您可以使用-Empty选项查找空的文件,而不管它们的名称是什么。

find . -empty

搜索结果中将列出任何零字节长度的文件。

-Executable选项将查找任何可以执行的文件,例如程序或脚本。

find . -executable

结果列出了一个名为“fix_aptget.sh”的文件。

它们还包含三个目录,包括当前目录‘.’。这些目录包含在结果中,因为它们的文件权限中设置了EXECUTE位。如果没有这一点,您将无法切换到(“运行”)这些目录。

-type选项

-type选项允许您搜索要查找的对象类型。我们将提供类型指示符“f”作为-type选项的参数,因为我们希望find只搜索文件。

find . executable -type f

这次没有列出子目录。可执行脚本文件是结果中的唯一项。

我们还可以要求find在结果中只包含目录。要列出所有目录,我们可以使用带有类型指示符“d”的-type选项。

find . type -d

结果中只列出目录和子目录。

将其他命令与FIND配合使用

您可以对找到的文件执行一些附加操作。您可以依次将文件传递给其他命令。

如果需要确保当前目录和子目录中没有可执行文件,可以使用以下命令:

find . -name "fix_aptget.sh" -exec chmod -x '{}' \;

该命令表示:

在当前目录中搜索名为“fix_aptget.sh”的命名对象。 如果找到,请执行chmod命令。 传递给chmod的参数是-x(删除可执行权限)和‘{}’(表示找到的文件的文件名)。 最后一个分号标记要传递给chmod的参数的末尾。这必须通过在前面加上‘\’反斜杠来“转义”。

运行此命令后,我们可以像以前一样搜索可执行文件,这次不会列出任何文件。

为了把网撒得更大,我们可以使用文件模式,而不是示例中使用的文件名。

这种灵活性允许您搜索指定的文件类型或文件名模式,并对匹配的文件执行一些操作。

“查找”还有许多其他选项,包括按修改日期搜索文件、用户或组拥有的文件、可读文件或具有特定文件权限集的文件。

LOCATE和MLOCATE命令

许多Linux发行版过去都包含一份Locate副本。这已被mlocate命令所取代,后者是Locate的改进和更新版本。

在系统上安装mlocate时,它会修改locate命令,这样即使您键入locate,您也可以实际使用mlocate。

检查了当前版本的Ubuntu、Fedora和Manjaro,看它们上是否预装了这些命令的版本。Ubuntu和Fedora都包含mlocate,但它必须安装在Manjaro上,命令如下:

sudo pacman -Syu mlocate

在Ubuntu上,你可以交替使用locate和mlocate。在Fedora和Manjaro上,你必须输入locate,但命令会由mlocate为你执行。

如果您使用带有locate的--version选项,您将看到响应的命令实际上是mlocate。

locate --version

因为Locate可以在所有测试过的Linux发行版上运行,所以我们将在下面的解释中使用Locate。而且打字少了一个字母。

定位数据库

定位系统最大的优势是速度。

当您使用find命令时,它会中断并在您的文件系统中执行搜索。它会进行数据库查找,以确定您要查找的内容是否在您的计算机上。这使得搜索速度大大加快。

当然,它确实提出了一个关于数据库的明显问题。如何确保数据库是最新的?安装mlocate后,它(通常)会在cron.Daily中放置一个条目。它每天(清晨)运行并更新数据库。

要检查此条目是否存在,请使用以下命令:

ls /etc/cron.daily/*loc*

如果您在那里找不到条目,您可以设置一个自动任务在您选择的时间为您执行此操作。

相关:如何在Linux上调度任务:Crontab文件简介

如果您的计算机在数据库应该更新时没有打开怎么办?您可以使用以下命令手动运行数据库更新进程:

sudo updatedb

使用定位

让我们查找包含字符串“getlatlong”的文件。使用LOCATE,搜索会自动查找文件名中任意位置包含搜索词的任何匹配项,因此不需要使用通配符。

locate getlatlong

很难在屏幕截图中传达速度,但几乎立刻就会为我们列出匹配的文件。

告诉定位您想要多少个结果

有时您可能知道有很多您要搜索的文件类型。你只需要看看它们中的前几个。也许您只想被提醒它们位于哪个目录中,而不需要看到所有的文件名。

使用-n(数字)选项可以限制Locate将返回给您的结果数。在此命令中,我们设置了10个结果的限制。

locate .html -n 10

Locate通过列出它从数据库检索到的前10个匹配的文件名进行响应。

对匹配文件进行计数

如果您只想知道匹配文件的数量,而不需要知道它们的名称或它们在硬盘上的位置,请使用-c(Count)选项。

locate -c .html

现在,我们知道这台计算机上有431个扩展名为“.html”的文件。也许我们确实想看一看,但我们想先看一眼,看看有多少。有了这些知识,我们知道我们将需要通过更少的管道输出。

locate .html | less

它们都在这里,或者说至少在长长的列表中排在首位。

使用LOCATE忽略案例

i(忽略大小写)会导致Locate执行此操作,它会忽略搜索词和数据库中的文件名之间的大小写差异。如果我们再次尝试对HTML文件进行计数,但是错误地提供了大写的搜索词,我们将得不到任何结果。

locate -c .HTML

通过包含-i选项,我们可以使其定位并忽略大小写差异,并返回这台机器的预期答案431。

locate -c -i .HTML

定位数据库状态

要查看数据库的状态,请使用-s(状态)选项。这会导致LOCATE返回有关数据库大小和内容的一些统计信息。

locate -s

Which命令

Which命令在您的路径中搜索目录,并尝试找到您正在搜索的命令。它允许您确定当您在命令行中键入程序或命令的名称时将运行的程序或命令的版本。

想象一下,我们有一个名为geoloc的程序。我们知道它安装在电脑上,但我们不知道它在哪里。它一定在路径中的某个位置,因为当我们键入它的名称时,它就会运行。*我们可以使用以下命令来定位它:

which geoloc

它报告程序位于/usr/local/bin中。

我们可以使用-a(All)选项检查路径中的其他位置是否有该程序的任何其他副本。

which -a geoloc

这表明我们在两个地方有geoloc程序。

当然,Bash shell每次都会首先找到/usr/local/bin中的副本,因此将程序放在两个位置是没有意义的。

删除/usr/bin/geoloc中的版本将为您节省一点硬盘容量。更重要的是,它还将避免有人手动更新程序并在错误的位置进行更新所造成的问题。然后想知道为什么他们在运行程序时看不到新的更新。

Where is命令

Where is命令类似于Which命令,但它的信息量更大。

除了命令或程序文件的位置外,Where is还会报告手册页和源代码文件的位置。*在大多数情况下,源代码文件不会在您的计算机上,但如果它们在,Where is会报告它们的位置。

二进制可执行文件、手册页和源代码通常被称为该命令的“包”。*如果您想要了解该命令的包的各个组件的位置,请使用以下命令:

whereis diff

其中列出了diff手册页和diff二进制文件的位置作为响应。

要将结果限制为只显示二进制文件的位置(实际上,使Where is像这样工作),请使用-b(二进制文件)选项。

whereis -b diff

其中只报告可执行文件的位置。

要将搜索限制为仅在手册页上报告,请使用-m(手动)选项。要将搜索限制为仅报告所有源代码文件,请使用-s(源)选项。

要查看搜索位置,请使用-l(位置)选项。

whereis -l

位置已为您列出。

既然我们知道了将要搜索的位置,如果我们选择的话,我们可以将搜索限制在特定的位置或位置组。

-B(二进制列表)选项将可执行文件的搜索限制在命令行上提供的路径列表中。*您必须至少提供一个位置以供搜索。-f(文件)选项用于表示文件名开头最后一个位置的结束。

whereis -B /bin/ -f chmod

在我们要求搜索的那个地方找。那正好是文件所在的位置。

您还可以使用-M(手动列表)选项将手册页的搜索限制为您在命令行上提供的路径。-S选项(源代码列表)允许您以同样的方式限制对源代码文件的搜索。

Whatis命令

whatis命令用于快速搜索手册页。它提供了您要求它搜索的术语的一行摘要描述。

让我们从一个简单的例子开始。虽然这看起来像是深入哲学辩论的起点,但我们只是在问,什么才能告诉我们“人”这个词是什么意思。

whatis man

Whatis找到两个匹配的描述。它打印每个比赛的简短描述。它还列出了手册中包含每个完整说明的编号部分。

要在描述man命令的部分打开手册,请使用以下命令:

man 1 man

本手册在MAN(1)部分打开,位于MAN页面。

要在第7节打开手册,请在讨论可用于生成手册页的宏的页面上使用以下命令:

man 7 man

将为您显示手册宏的手册页。

在手册的特定部分进行搜索

-s(节)选项用于将搜索限制在您感兴趣的手册部分。要将Whatis搜索限制在手册的第7节,请使用以下命令。请注意节号周围的引号:

whatis -s "7" man

结果仅参考手册的第7节。

使用带有通配符的Whatis

您可以对Whatis使用通配符。您必须使用-w(通配符)选项来执行此操作。

whatis -w char*

匹配结果列在终端窗口中。

Apropos命令

Apropos命令类似于Whatis,但它有更多的花哨之处。它搜索手册页标题和一行描述,查找搜索词。它还会在终端窗口中列出匹配的手册页说明。

单词apropos的意思是“相关的”或“令人担忧的”,命令apropos就是由此得名的。如果要搜索与GROUPS命令相关的任何内容,我们可以使用以下命令:

apropos groups

Apropos将结果列出到终端窗口。

使用多个搜索词

您可以在命令行上使用多个搜索词。Apropos将搜索包含这两个搜索词之一的手册页。

apropos chown chmod

结果如前所述列出。在这种情况下,每个搜索词都有一个条目。

使用完全匹配

Apropos将返回包含搜索词的手册页,即使搜索词位于另一个单词的中间。要使Apropos仅返回搜索词的精确匹配,请使用-e(精确)选项。

为了说明这一点,我们将使用带有grep的Apropos作为搜索词。

apropos grep

为此返回了许多结果,包括许多将grep合并到另一个词中的结果,例如bzfgrep。

让我们再试一次,并使用-e(精确)选项。

apropos -e grep

这一次我们有了一个单一的结果,就是我们实际上在搜索的东西。

匹配所有搜索词

正如我们在前面看到的,如果您提供多个搜索词,那么Apropos将搜索包含任何一个搜索词的手册页。我们可以使用-a(和)选项更改该行为。这使得恰如其分的只选择其中包含所有搜索时间的匹配。

让我们尝试不带-a选项的命令,这样我们就可以看到合适的结果。

apropos crontab cron

结果包括与其中一个搜索词匹配的手册页。

现在我们将使用-a选项。

apropos -a crontab cron

这一次,搜索结果的范围缩小到同时包含两个搜索词的搜索结果。

还有更多的选择

所有这些命令都有更多选项-其中一些选项更多-建议您阅读我们在本文中讨论的命令的手册页。

以下是每个命令的快速摘要:

查找:提供功能丰富的细粒度搜索功能来查找文件和目录。 定位:提供对程序和命令的快速数据库驱动搜索。 其中:搜索$PATH查找可执行文件。 Where is:搜索$PATH以查找可执行文件、手册页和源代码文件。 内容:在MAN单行描述中搜索与搜索词匹配的内容。 恰如其分:搜索手册页的精确度比Whatis更高,以查找与一个或多个搜索词匹配的内容。

正在查找更多Linux终端信息吗?这里有37条你应该知道的命令。

相关:37条您应该知道的重要Linux命令

相关文章