如何在 Linux 中使用查找命令

最流行的命令行实用程序之一是 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它匹配任何以“example。” 在通配符运算符的帮助下,我们看到第一条语句没有考虑文件类型。

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

通过添加 flag -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 将访问符号链接(在本例中,link.directory 链接到 example.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 设置搜索范围。 在下面 example,我们可以看到 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 服务器上进行磁盘调查期间确定我们的确切空间分布非常有用。 我们将深入研究最常见的用途。

查找和列出文件

这个实用程序如此受欢迎的原因之一是我们可以附加其他命令来执行我们刚刚找到的文件列表。 这就是我们刚才所做的 example,通过在 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 的文件,而在第三个 example,我们使用 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 可以做的事情的表面。 毫无疑问,这是一个强大的工具,在数据操作中具有许多潜在的应用。