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

时间:2020-01-09 10:39:49  来源:igfitidea点击:

Linux提供了六种不同的搜索方式,每种都有其优点。我们将演示如何使用"查找","定位","其中"," whereis"," whatis"和" apropos"。每个人都擅长不同的任务;这是为工作选择正确工具的方法。

在Linux中进行搜索和查找的命令时,我们会无所适从。为什么那么多?好吧,他们每个人都有自己的专长,并且在某些情况下的表现要比其他人更好。我们可以将它们视为一种搜寻的瑞士军刀。我们将依次研究每个刀片,并找出其特定的优势。

find命令

find命令的行为很难通过反复试验来确定。一旦了解了语法,就可以开始欣赏它的灵活性和功能。

使用find的最简单方法是键入find并按Enter。

find

以这种方式使用find就像ls一样,但是它列出了当前目录中的所有文件以及子目录中的所有文件。

find的某些实现要求我们将.放入当前目录。如果Linux版本是这种情况,请使用以下命令:

find .

要从根文件夹中查找,请使用以下命令:

find /

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

find ~

将find与文件模式一起使用

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

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

使用此命令,我们将在当前文件夹中搜索与模式*。* s匹配的文件。这意味着任何文件扩展名为s的文件名。我们使用-name选项告诉find我们正在传递文件名或者文件名模式。

find . -name "*.*s"

find返回这些匹配文件。

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

如果我们事先知道我们在寻找JavaScript .js文件,那么我们在文件模式中可能会更加具体。另外,请注意,我们可以根据需要使用单引号将模式引起来。

find . -name '*.js'

这次"查找"仅报告JavaScript文件。

使用find忽略大小写

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

find . -name 'Yelp.js'

那什么也没返回。但是奇怪的是,我们知道文件必须存在。让我们再试一次,告诉find忽略大小写。我们通过使用-iname选项(忽略大小写名称)来实现

find. -iname 'Yelp.js'

这就是问题所在,文件名以小写的y开头,而我们以大写的Y进行搜索。

用find递归子目录

find的一大优点是它递归搜索子目录的方式。让我们搜索以map开头的所有文件。

find . -name "map*.*"

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

使用find搜索目录

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

find . -path '*about'

找到该目录,该目录只是被调用,并嵌套在当前目录内的另一个目录中。

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

将文件属性与find结合使用

find可以查找具有与搜索线索匹配的属性的文件。例如,我们可以使用-empty选项查找空文件,而不管它们叫什么名字。

find . -empty

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

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

find . -executable

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

它们还包含三个目录,其中包括当前目录。'。这些目录包含在结果中,因为在文件许可权中设置了执行位。没有这个,我们将无法更改(运行)这些目录。

-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的参数的结尾。必须通过在其前面加上反斜杠来对其进行转义。

运行此命令后,我们可以像以前一样搜索可执行文件,这一次将没有文件列出。

为了扩大网络范围,我们可以使用文件模式代替示例中使用的文件名。

这种灵活性使我们可以搜索指定的文件类型或者文件名模式,并对匹配的文件执行某些操作。

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

find和mlocate命令

许多Linux发行版都带有一个" locate"副本。该命令已被locate的改进和更新版本的mlocate命令所取代。

当系统上安装了mlocate时,它会修改locate命令,以便即使我们键入locate也可以实际使用mlocate

检查了Ubuntu,Fedora和Manjaro的当前版本,以查看它们是否已预先安装了这些命令的版本。 Ubuntu和Fedora都包含" mlocate"。必须使用以下命令将其安装在Manjaro上:

sudo pacman -Syu mlocate

在Ubuntu上,我们可以互换使用locate和mlocate。在Fedora和Manjaro上,我们必须输入locate,但是命令由mlocate执行

如果将--version选项与locate'一起使用,我们会看到响应的命令实际上是mlocate`。

locate --version

因为locate可以在所有经过测试的Linux发行版上工作,所以在下面的说明中将使用locate。而且要键入的字母要少一个。

定位数据库

"定位"具有的最大优势是速度。

当我们使用find命令时,它破折号并在整个文件系统中执行搜索。它执行数据库查找,以确定我们要查找的内容是否在计算机上。这样可以使搜索更快。

当然,这确实引起了有关数据库的明显问题。是什么确保数据库是最新的?安装mlocate后(通常)将条目放置在cron.daily中。它每天(非常早)运行并更新数据库。

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

ls /etc/cron.daily/*loc*

如果我们在此处找不到条目,则可以设置一个自动任务来在我们选择的时间为我们执行此操作。

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

sudo updatedb

使用定位

让我们查找包含字符串getlatlong的文件。使用locate,搜索会自动在文件名中的任何位置查找包含搜索词的所有匹配项,因此无需使用通配符。

locate getlatlong

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

告诉定位我们想要多少个结果

有时,我们可能会知道有许多搜索类型的文件。我们只需要查看其中的前几个即可。也许我们只想提醒他们它们在哪个目录中,而无需查看所有文件名。

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

locate .html -n 10

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

计数匹配文件

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

locate -c .html

因此,现在我们知道这台计算机上有431个扩展名为.html的文件。也许我们确实想看看它们,但是我们认为我们先看看有多少个。有了这些知识,我们知道我们需要将输出通过less传递出去。

locate .html | less

在这里,它们都是,或者至少在这里是一长串。

使用locate忽略案例

-i(忽略大小写)使locate做到这一点,它忽略了搜索词与数据库中文件名之间的大小写差异。如果我们尝试重新计数HTML文件,但错误地将搜索词用大写形式提供,则结果将为零。

locate -c .HTML

通过包含-i选项,我们可以使'locate'忽略大小写的区别,并返回我们对这台机器的预期答案,即431.

locate -c -i .HTML

定位数据库状态

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

locate -s

哪个命令

which命令将搜索路径中的目录,并尝试找到要搜索的命令。它使我们可以确定在命令行上键入程序或者命令的名称时将运行哪个版本。

想象一下,我们有一个名为" geoloc"的程序。我们知道它已安装在计算机上,但我们不知道它的位置。它必须在路径中的某处,因为当我们键入它的名称时,它将运行。我们可以通过以下命令使用which来定位它:

which geoloc

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

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

which -a geoloc

这说明我们在两个地方都有" geoloc"程序。

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

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

whereis命令

whereis命令与which命令相似,但是它提供的信息更多。

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

二进制可执行文件,手册页和源代码通常被称为该命令的软件包。如果我们想知道diff命令的软件包的各个组件位于何处,请使用以下命令:

whereis diff

whereis通过列出diff手册页和diff二进制文件的位置进行响应。

为了将结果限制为仅显示二进制文件的位置(实际上,使whereiswhich一样工作),请使用-b(binary)选项。

whereis -b diff

whereis仅报告可执行文件的位置。

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

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

whereis -l

为我们列出了这些位置。

现在我们知道了位置" whereis"将其中搜索,我们可以选择将搜索限制为特定位置或者一组位置。

-B(二进制列表)选项将对可执行文件的搜索限制为命令行中提供的路径列表。我们必须提供至少一个位置供" whereis"搜索。 -f(文件)选项用于表示文件名末尾位置的末尾。

whereis -B /bin/ -f chmod

" whereis"位于我们要求搜索的单个位置。这恰好是文件所在的位置。

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

whatis命令

whatis命令用于快速搜索手册页。它提供了我们要搜索的术语的单行摘要说明。

让我们从一个简单的例子开始。尽管这看起来像是深入的哲学辩论的起点,但我们只是在问" whatis"来告诉我们"人"一词的含义。

whatis man

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


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

man 1 man

手册在man(1)页面的man(1)部分打开。

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

man 7 man

将为我们显示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"(精确)选项。

为了说明这一点,我们将使用apropos和grep作为搜索词。

apropos grep

为此返回了许多结果,包括许多在另一个词中包含了" grep"的地方,例如" bzfgrep"。

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

apropos -e grep

这次我们只有一个结果,实际上是我们要寻找的结果。

匹配所有搜索词

如前所述,如果我们提供多个搜索词,则" apropos"将搜索包含两个搜索词的手册页。我们可以通过使用-a(和)选项来改变行为。这使得" apropos"仅选择其中具有所有搜索时间的匹配项。

让我们尝试不带-a选项的命令,以便我们可以看到apropos给出的结果。

apropos crontab cron

结果包括与一个或者另一个搜索词匹配的手册页。

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

apropos -a crontab cron

这次将结果缩小到包含两个搜索词的结果。

还有更多选择

所有这些命令都有更多选项,其中一些还有更多选项,鼓励我们阅读本文中讨论的命令的手册页。

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

  • find:提供功能丰富且细粒度的搜索功能,以查找文件和目录。

  • locate:提供快速的数据库驱动的程序和命令搜索。

  • which:搜索$ PATH以查找可执行文件

  • whereis:搜索$ PATH,以查找可执行文件,手册页和源代码文件。

  • whatis:在人的单行描述中搜索与搜索词匹配的内容。

  • apropos:以比whatis更高的保真度搜索手册页,以查找与搜索词或者多个搜索词相匹配的内容。