Linux 系统提供了六种截然不同的搜索工具,每种工具都有其独特的优势。我们将深入探讨如何使用 find
、locate
、which
、whereis
、whatis
和 apropos
这些命令。 它们各自擅长不同的任务; 以下是如何为特定工作选择最合适的工具。
在 Linux 环境中进行搜索时,你会发现有多种命令可供选择。 为什么会有这么多? 这是因为它们各有侧重,在某些场景下表现更佳。 你可以把它们想象成一套搜索工具箱。接下来,我们将逐一分析每个工具,并揭示它们的独特优势。
find
命令
find
命令的行为初学者可能会觉得难以捉摸。 但是,一旦你理解了它的语法,就会开始欣赏它的灵活性和强大功能。
使用 find
最简单的方法是直接键入 find
并按下回车键。
find
这样使用 find
的效果类似于 ls
命令,它会列出当前目录及其所有子目录下的所有文件。
在某些 Linux 版本中,你可能需要在命令中显式指定当前目录 .
。 如果你的 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
命令,而无需使用模式。 如果文件名中不包含通配符,则不需要使用引号包围文件名,但最好始终这样做,这样可以避免忘记在需要时使用它们。
find . -name 'Yelp.js'
命令没有返回任何结果。 但我们知道该文件肯定存在。 让我们再试一次,并告诉 find
忽略大小写。 我们可以使用 -iname
选项(忽略大小写名称)来实现这一点。
find. -iname 'Yelp.js'
问题在于,文件名是以小写字母 y
开头的,而我们搜索的是大写字母 Y
。
使用 find
递归子目录
find
的一个主要优势是它可以递归搜索子目录。 让我们搜索任何以 map
开头的文件。
find . -name "map*.*"
列出了所有匹配的文件。 请注意,它们都位于一个子目录中。
使用 find
搜索目录
-path
选项使 find
能够查找目录。 让我们查找一个我们不太记得名称的目录,但我们知道它以字母 about
结尾。
find . -path '*about'
找到了名为 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
找到的文件执行其他操作。 你可以将文件依次传递给其他命令。
如果我们需要确保当前目录和子目录中没有可执行文件,我们可以使用以下命令:
find . -name "fix_aptget.sh" -exec chmod -x '{}' ;
该命令的含义是:
在当前目录中搜索名为 fix_aptget.sh
的对象。
如果找到,则执行 chmod
命令。
传递给 chmod
的参数是 -x
,表示删除可执行权限,以及 '{}'
,代表找到的文件名。
最后的分号表示要传递给 chmod
的参数的结束。 这必须使用反斜杠 \
来“转义”。
运行此命令后,我们可以像以前一样搜索可执行文件,这次不会列出任何文件。
为了扩展我们的搜索范围,我们可以使用文件模式,而不是在上面的示例中使用的文件名。
这种灵活性允许你搜索指定的文件类型或文件名模式,并对匹配的文件执行一些操作。
find
命令还有许多其他选项,包括按修改日期搜索文件、用户或组拥有的文件、可读文件或具有特定文件权限集的文件。
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
执行的。
如果你将 --version
选项与 locate
一起使用,你会看到返回的命令实际上是 mlocate
。
locate --version
因为 locate
在所有经过测试的 Linux 发行版中都适用,我们将在下面的解释中使用 locate
。 而且可以少写一个字母。
定位数据库
locate
的最大优势是速度。
当你使用 find
命令时,它会在你的文件系统中执行搜索。 locate
命令的工作方式截然不同。 它通过查找数据库来确定你要查找的内容是否在你的计算机上。 这使得搜索速度更快。
当然,这引发了关于数据库的明显问题。 如何确保数据库是最新的? 当安装 mlocate
时,它会在 cron.daily
中放置一个条目。 这会在每天(很早的时候)运行并更新数据库。
要检查此条目是否存在,请使用以下命令:
ls /etc/cron.daily/*loc*
如果你在那里没有找到条目,你可以设置一个自动任务,在你选择的时间为你执行此操作。
如果你的计算机在应该更新数据库时没有打开怎么办? 你可以使用以下命令手动运行数据库更新过程:
sudo updatedb
使用 locate
让我们查找包含字符串 getlatlong
的文件。 使用 locate
时,搜索会自动查找文件名中任何位置包含搜索词的任何匹配项,因此无需使用通配符。
locate getlatlong
很难在屏幕截图中传达速度,但它几乎立即为我们列出了匹配的文件。
告诉 locate
你想要多少结果
有时你可能知道有很多你正在搜索的文件类型。 你只需要查看其中的前几个。 也许你只是想知道它们位于哪个目录中,而不需要查看所有的文件名。
使用 -n
(number)选项,你可以限制 locate
返回给你的结果数。 在此命令中,我们设置了 10 个结果的限制。
locate .html -n 10
locate
会列出它从数据库中检索到的前 10 个匹配的文件名。
计数匹配文件
如果你只想知道匹配文件的数量,而不需要知道它们的名称或它们在硬盘驱动器上的位置,请使用 -c
(count)选项。
locate -c .html
所以,现在我们知道这台计算机上有 431 个扩展名为 .html
的文件。 也许我们确实想看看它们,但我们想先看看有多少个。 有了这个信息,我们知道我们需要将输出通过管道传递给 less
命令。
locate .html | less
它们都在这里,或者至少,这是它们长长列表中的开头部分。
使用 locate
忽略大小写
-i
(忽略大小写) 选项使 locate
忽略搜索词和数据库中文件名之间的大写和小写差异。 如果我们再次尝试对 HTML 文件进行计数,但错误地以大写形式提供了搜索词,我们将得到零个结果。
locate -c .HTML
通过包含 -i
选项,我们可以让 locate
忽略大小写的差异,并返回我们对这台机器的预期答案,即 431。
locate -c -i .HTML
locate
数据库状态
要查看数据库的状态,请使用 -s
(状态)选项。 这会导致 locate
返回有关数据库大小和内容的一些统计信息。
locate -s
which
命令
which
命令搜索路径中的目录,并试图找到你正在查找的命令。 当你在命令行中键入程序或命令的名称时,它允许你确定将运行哪个版本的程序或命令。
假设我们有一个名为 geoloc
的程序。 我们知道它安装在计算机上,但我们不知道它的位置。 它必须在某个路径中,因为当我们键入它的名称时,它会运行。 我们可以通过以下命令使用 which
来定位它:
which geoloc
它报告该程序位于 /usr/local/bin
中。
我们可以使用 -a
(all)选项来检查在路径内的其他位置是否有该程序的任何其他副本。
which -a geoloc
这表明我们在两个地方都有 geoloc
程序。
当然,/usr/local/bin
中的副本每次都会被 Bash shell 首先找到,因此将程序放在两个地方是没有意义的。
删除 /usr/bin/geoloc
中的版本可以为你节省一些硬盘空间。 更重要的是,它还可以避免有人手动更新程序并在错误的地方进行操作而造成的问题。 然后会想知道为什么在运行程序时看不到新的更新。
whereis
命令
whereis
命令类似于 which
命令,但信息量更大。
除了命令或程序文件的位置之外,whereis
还会报告 man
(手册)页和源代码文件所在的位置。 在大多数情况下,你的计算机上不会有源代码文件,但如果存在,whereis
会报告它们。
二进制可执行文件、手册页和源代码通常被称为该命令的“包”。 如果你想知道 diff
命令的包的各个组件的位置,请使用以下命令:
whereis diff
whereis
会列出 diff
手册页和 diff
二进制文件的位置。
要将结果限制为仅显示二进制文件的位置(实际上,使 whereis
像 which
一样工作),请使用 -b
(binary)选项。
whereis -b diff
whereis
只报告可执行文件的位置。
要将搜索限制为仅报告手册页,请使用 -m
(manual)选项。 要将搜索限制为仅报告源代码文件,请使用 -s
(source)选项。
要查看 whereis
搜索的位置,请使用 -l
(location)选项。
whereis -l
这些位置已为你列出。
既然我们知道要搜索的位置,我们可以(如果需要)将搜索限制在特定位置或一组位置。
-B
(binary list)选项将可执行文件的搜索限制为在命令行上提供的路径列表中。 你必须提供至少一个位置供 whereis
进行搜索。 -f
(file)选项用于指示位置的结束,最后是文件名的开始。
whereis -B /bin/ -f chmod
<img loading=”lazy