如何在 Linux 中使用 Find 命令

最流行的命令行实用程序之一是 find 命令,主要是因为它的简单性和多功能性。 它是在多个基于 UNIX 的系统中搜索文件的默认选项,具有广泛的参数和变量以缩小我们的搜索范围。 它有助于查找与特定名称、日期、大小甚至所有者匹配的文件,以提供一个框架来将其他命令附加到找到的文件列表中。 find 命令的基本结构如下。

find [parameters] [path] [search patterns] 

基本搜索

虽然上述语法看起来很简单,但使用此实用程序,我们可以轻松执行复杂的搜索。 我们将讨论一些最有用的搜索模式,以充分利用此命令。 使用不带任何参数的 find 命令,它将查找当前位置的所有文件或目录。

LiquidWeb$ find  .  ./bad_script.sh  ./script.sh  ./big.log  ./test.txt  ./example.file  ./Example.file. /exAmpLe.file ./example.directory ./image.png ./app.php

现在让我们看看如何进行更具体的查询。

按名称查找文件或目录

find 命令的第一个用途是基本的文件/目录搜索。 如果我们想按名称搜索文件或目录,我们必须使用 -name 标签(或 -iname 用于不区分大小写的检查)。

LiquidWeb$ find . -name  "example.file"  ./example.file LiquidWeb$ find . -iname "example.file" ./example.file ./Example.file ./exAmpLe.file

这里我们使用句点或“.”。 来表示当前目录。 但是,这可以由目录树上的任何位置替换。 -name 标签仅显示与名称的完全匹配,而 -iname 标签显示任何匹配,无论它们是大写还是小写。

我们可以更具体地限制 find 命令来查找文件、目录或其他文件类型。 星号通配符“*”表示 0 个或多个字符。 在我们的示例中,它匹配以单词“example”开头的任何文件。 在通配符的帮助下,我们看到第一条语句没有考虑文件类型。

LiquidWeb$ find . -iname "example*"  ./example.file  ./Example.file  ./example.directory  ./example.directory/example2.file  ./exAmpLe.file

通过添加标志 -type,我们可以将范围缩小到仅文件或目录。

LiquidWeb$ find . -iname "example*" -type f  ./example.file  ./Example.file  ./example.directory/example2.file  ./exAmpLe.file  LiquidWeb$ find . -iname "example*" -type d  ./example.directory

其他文件类型包括:

  • l:符号链接
  • p:命名管道
  • c:字符设备
  • s:插座
  • b:块设备

特殊变量

我们可以将其他变量添加到我们的搜索中以获得更准确的结果。

包括符号链接

执行与上一节相同的搜索,但引入指令“-L”,find 将访问符号链接(在本例中,链接到 example.directory 的 link.directory)并查找匹配项。

LiquidWeb$ find -L -iname "example*"  ./example.file  ./Example.file  ./example.directory  ./example.directory/example2.file  ./exAmpLe.file  ./link.directory/example2.file

排除挂载点文件系统

选项 -xdev 允许 find 命令列出另一个文件系统中的挂载点或分区,但它不会下降到它们中。

LiquidWeb$ find . -xdev -name "app*" -type f  ./app2.php  ./app.php

最大深度

我们还可以使用 -maxdepth 设置搜索范围。 在下面的示例中,我们可以看到 find 仅下降到起点以下 1 级才能找到 /home 中的所有文件。

LiquidWeb$ find /home -maxdepth 1 -type f  /home/testing_max_depth.file

重定向错误消息

如果我们的搜索模式过于模糊,或者我们对文件所在的位置没有任何线索,并且在我们的专用服务器上没有根目录访问权限,我们的屏幕可能会出现诸如“权限被拒绝”之类的错误消息。 为了避免这种情况,我们可以将错误消息重定向到 /dev/null,这是一个唯一的设备文件,它会丢弃所有发送或写入的数据。

LiquidWeb$ find / -maxdepth 3 -name "my_file.txt"  find: ‘/root’:  Permission denied  find: ‘/lost+found’:  Permission denied  LiquidWeb$ find / -maxdepth 3 -name "my_file.txt" 2>/dev/null  LiquidWeb$

磁盘空间调查

find 命令对于在我们的 VPS 服务器上进行磁盘调查期间确定我们的确切空间分布非常有用。 我们将深入研究最常见的用途。

查找并列出文件

这个实用程序如此受欢迎的原因之一是我们可以附加其他命令来执行我们刚刚找到的文件列表。 这就是我们在这个例子中所做的,通过在 find 检索到所有匹配项后列出文件。

LiquidWeb$ find . -name "*.txt" -exec ls -lh {} ;  -rw-r--r-- 1 root root 2.0M Jan 22 15:44 ./lecture.txt  -rw-r--r-- 1 root root 4.2M Jan 22 15:45 ./test.txt  -rw-r--r-- 1 root root 9.5M Jan 22 15:45 ./blog.txt

让我们分解命令:

  • 找 。 -name “*.txt” – 按名称查找的常规搜索,在本例中为所有文本文件。
  • -exec – exec 命令是对参数列表执行命令的选项。
  • ls -lh {} – ls 命令是一个主要用于列出文件的命令实用程序。 我们还添加了 -lh,它代表“长列表”和“人类可读”,它打印有关文件的详细信息并以前缀乘数(在本例中为兆字节)显示大小。

查找空文件或目录

我们会看到在某些情况下我们的磁盘使用率相对较低,但我们的 inode 是通过屋顶的。 这可能是由不成比例的空文件或目录引起的,我们可以使用 find 和标签 -empty 进行追踪。

LiquidWeb$ find . -type f -empty  ./empty2.file  ./empty3.file  ./empty.file  LiquidWeb$ find . -type d -empty  ./empty_dir

按日期查找文件或目录

要根据时间查找文件,我们可以使用 -newerXY 指令。 这是选项列表:

  • mt:修改时间
  • at:访问时间
  • ct:inode 状态变化
  • bt:出生时间
LiquidWeb$ find . -type f !  -newermt 2021-01-23  ./new_image.png  ./another_app.php  LiquidWeb$ find . -type f ! -newermt 2015-12-19 ./very_old_file.txt  LiquidWeb$ find . -type f ! -newerat 2015-12-19 ./very_old_file.txt

在显示的示例中,我们首先查找修改日期等于或晚于 2021-01-23 的文件。 对于随后的语句,我们引入了“!” 运算符,意思是“不是”。 在本例中,我们要查找修改日期早于 2015-12-19 的文件,在第三个示例中,我们使用 at 或 access time 作为参数。 这在我们的托管云服务器中定位文件时特别有用

按大小查找文件或目录

大小选项让我们可以找到超过、匹配或低于确定的大小阈值的特定文件。 在下面的例子中,我们要定位:

  • 大小正好为 950k 的文件。
  • 大小超过 50M 的文件。
  • 大小低于 25M 的文件。
  • 大小在 2M-5M 范围内的文件。
LiquidWeb$ find . -type f -size 950k  ./blog.txt (950k)  LiquidWeb$ find . -type f -size +50M ./55M_file  LiquidWeb$ find . -type f -size -25M ./20M_file  LiquidWeb$ find . -type f -size +2M -size 5M ./test.txt (4.2M)

查找和删除

要使用 find 命令删除不需要的文件,请将 -delete 选项添加到文件列表中。

LiquidWeb$ find /var/log/ -name "*.temp" -delete LiquidWeb$

注意:使用 -delete 时要小心,因为它会破坏数据。 在删除文件之前查看文件列表总是一个好习惯。

面向安全的检查

如果我们怀疑存在安全漏洞或恶意软件感染,在初步调查期间发现可能非常有价值。

按权限查找文件

尽可能避免使用具有 777 权限的文件。 使用 -perm 标签真的很容易在我们的文件系统中找到权限不正确的文件或目录。

LiquidWeb$ find . -type f -perm 777  ./not_malware.php   LiquidWeb$ find . -type d -perm 777  ./good_dir

如果我们发现的文件不应该具有这些权限,我们可以立即更改它们。 例如,如果我们想为文件设置 644 权限,我们可以使用下面的命令。

LiquidWeb$ find . -type f -perm 777 -exec chmod 644 {} ;

按所有者查找文件和目录

所有者不正确的文件不一定是恶意的。 但是,在某些情况下,这可能表明存在问题。 我们可以使用 -user 标签轻松追踪它们。

LiquidWeb$ find . -user nobody  ./bad_script.sh

按修改时间查找文件

我们可以根据修改时间列出文件。 -atime 选项可方便地确定在定义的天数间隔内访问的文件。 在第一个和第二个示例中,我们要查找在过去 30 天内访问过的文件以及在过去 30 天内访问过的文件。

对于第三个命令,我们将改为查看修改时间。 这些指令遵循与 按日期查找文件或目录 以上部分。

LiquidWeb$ find . -name "*.png" -atime -30  ./new_image.png   LiquidWeb$ find . -name "*.png" -atime +30 ./old_image.png  LiquidWeb$ find . -name "*.txt" -mtime -30  ./lecture.txt  ./test.txt  ./blog.txt

结论

我们已经了解了 find 命令的几个实际用途。 正如我们所见,我们不仅可以找到文件或目录,而且在怀疑恶意行为时,很容易执行磁盘调查或注意到文件的奇怪模式。 当我们将其他命令附加到它的文件列表时,我们只触及了 find 可以做什么的表面。 毫无疑问,这是一个强大的工具,在数据处理中具有许多潜在的应用。