介绍
用户初学使用 Linux 时遇到的问题之一是如何找到所需的文件。本指南将向您展示如何使用该命令。 寻找 它涵盖了文件名。它可以帮助您使用各种筛选条件和参数在系统中搜索文件。它还简要介绍了命令。 定位 它可以用于以不同的方式搜索文件。.
先决条件
- 要学习本指南,您需要一台运行 Linux 操作系统的计算机。这可以是您通过 SSH 连接的虚拟专用服务器 (VPS),也可以是您的本地计算机。请注意,本教程已在运行 Ubuntu 20.04 的 Linux 服务器上验证过,但提供的示例应该适用于运行任何 Linux 发行版任何版本的计算机。.
按名称查找
最直接的文件搜索方法是按文件名搜索。要使用以下命令按文件名查找文件: 寻找您应该使用以下命令:
find -name "query"这将区分大小写,这意味着搜索查询与搜索“ 询问 情况有所不同。要按名称查找文件但忽略查询的大小写,请使用 -iname 选项:
find -iname "query"如果要查找所有不符合特定模式的文件,可以使用以下方法缩小搜索范围: -不是 撤销:
find -not -name "query_to_avoid"或者,您可以使用感叹号 (!) 进行反向搜索,如下所示:
find \! -name "query_to_avoid"请注意,如果您使用 !,则必须先用反斜杠 (\) 转义该字符才能使用它。 寻找 可以解释它,但 shell 不会尝试解释它。.
按类型查找
带参数 -类型 您可以指定要查找的文件类型。具体操作方法如下:
find -type type_descriptor query以下是一些可用于确定文件类型的描述符:
- f:常规文件
- d:目录
- l:符号链接
- c:字符设备
- b:阻止设备
例如,如果您想查找系统上的所有字符设备,可以发出以下命令:
find /dev -type c该命令专门用于搜索 /dev 文件夹中的设备,该目录通常是 Linux 系统上安装设备文件的目录:
Output
/dev/vcsa5
/dev/vcsu5
/dev/vcs5
/dev/vcsa4
/dev/vcsu4
/dev/vcs4
/dev/vcsa3
/dev/vcsu3
/dev/vcs3
/dev/vcsa2
/dev/vcsu2
/dev/vcs2
. . .您可以查看所有文件 .conf 搜索以.结尾的文件。此示例将在文件夹中查找匹配的文件。 /usr 搜索内容:
find /usr -type f -name "*.conf"Output
/usr/src/linux-headers-5.4.0-88-generic/include/config/auto.conf
/usr/src/linux-headers-5.4.0-88-generic/include/config/tristate.conf
/usr/src/linux-headers-5.4.0-90-generic/include/config/auto.conf
/usr/src/linux-headers-5.4.0-90-generic/include/config/tristate.conf
/usr/share/adduser/adduser.conf
/usr/share/ufw/ufw.conf
/usr/share/popularity-contest/default.conf
/usr/share/byobu/keybindings/tmux-screen-keys.conf
/usr/share/libc-bin/nsswitch.conf
/usr/share/rsyslog/50-default.conf
. . .按时间和大小筛选
寻找 它提供了按大小和时间筛选结果的不同方法。.
尺寸
使用参数 -尺寸 您可以根据文件大小筛选文件。为此,您需要在数字大小值的末尾添加一个特殊后缀,以指示您是以字节、兆字节、千兆字节还是其他单位来计算大小。以下是一些常用的大小后缀:
- c: 字节
- k:千字节
- m:兆字节
- g:千兆字节
- b:512 字节块
例如,以下命令将在 /usr 目录中查找长度正好为 50 字节的任何文件:
find /usr -size 50c要查找小于 50 字节的文件,可以使用以下语法:
find /usr -size -50c要查找 /usr 文件夹中大于 700 MB 的文件,可以使用以下命令:
find /usr -size +700M时间
Linux 会为系统中的每个文件存储访问时间、修改时间和更新时间的时间戳。.
- 访问时间:文件上次被读取或写入的时间。.
- 修改时间:文件内容最后一次被修改的时间。.
- 修改时间:文件 inode 元数据最后一次更改的时间。.
使用选项 一次- ,mtime- 和 -ctime您可以根据这些参数进行查找搜索。对于每个选项,您必须传递一个值,该值指示您要搜索过去的多少天。与前面描述的大小选项类似,您可以在这些选项前添加加号或减号,以指定«大于»或«小于»。.
例如,要查找 /usr 文件夹中过去一天内修改过的文件,请运行以下命令:
find /usr -mtime 1如果你想获取一天以内访问过的文件,可以运行以下命令:
find /usr -atime -1要查找元数据上次更改时间超过 3 天的文件,您可以运行以下命令:
find /usr -ctime +3这些选项还附带一些参数,您可以使用这些参数来指定分钟而不是天:
find /usr -mmin -1这将显示上次修改过的文件。.
寻找 它还可以与参考文件进行比较,并返回更新的项目:
find / -newer reference_file此语法返回系统中相对于参考文件最近创建或更改的任何文件。.
按所有者和权限查找
您还可以使用 -user 和 -group 参数按文件所有者的用户或组搜索文件。要查找 /var 目录中属于 syslog 用户的所有文件,请运行以下命令:
find /var -user syslog同样,您可以通过键入以下命令列出 /etc 目录中属于 shadow 组的文件:
find /etc -group shadow您还可以搜索具有特定权限的文件。.
如果要匹配一组精确的权限,可以使用以下语法,该语法使用八进制表示法指定权限:
find / -perm 644这会将文件与指定的权限完全匹配。.
如果要指定至少具有以下权限的内容,可以在权限符号前加上减号:
find / -perm -644这会匹配任何具有额外权限的文件。例如,本例中权限为 744 的文件就符合条件。.
按深度过滤
在本节中,您将创建一个示例目录结构,并使用该结构来检查如何根据文件在结构中的深度进行过滤。如果您按照本教程中的示例操作,建议在 `/tmp/` 文件夹中创建这些文件和目录。`/tmp/` 是一个临时目录,这意味着其中的所有文件和目录都会在服务器下次启动时被删除。这对于本指南非常有用,因为您可以创建任意数量的目录、文件和链接,而无需担心它们会导致系统崩溃。运行本节中的命令后,您的 `/tmp/` 目录将包含三级目录,第一级目录包含十个子目录。每个子目录(包括临时目录)都将包含十个文件和十个子目录。.
使用以下命令在 /tmp/ 文件夹中创建示例目录结构:
mkdir -p /tmp/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}之后,使用 touch 命令向这些目录中填充一些示例文件:
touch /tmp/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}}文件和目录准备就绪后,请切换到刚刚创建的 test/ 目录:
cd /tmp/test要基本了解如何从这种结构中检索文件,首先要搜索与名为 file1 的任何文件匹配的常规名称:
find -name file1Output
./level1dir7/level2dir8/level3dir9/file1
./level1dir7/level2dir8/level3dir3/file1
./level1dir7/level2dir8/level3dir4/file1
./level1dir7/level2dir8/level3dir1/file1
./level1dir7/level2dir8/level3dir8/file1
./level1dir7/level2dir8/level3dir7/file1
./level1dir7/level2dir8/level3dir2/file1
./level1dir7/level2dir8/level3dir6/file1
./level1dir7/level2dir8/level3dir5/file1
./level1dir7/level2dir8/file1
. . .这将产生大量结果。如果您将输出结果输入计数器,您会发现总共有 1111 个结果:
find -name file1 | wc -lOutput
1111在大多数情况下,搜索结果可能过多,对您来说用处不大。为了限制搜索结果,您可以在顶级搜索列表中指定最大搜索深度:
find -maxdepth num -name query要仅在一级及以上目录中查找 file1,您可以指定最大深度为 2(1 为顶级目录,1 为一级目录):
find -maxdepth 2 -name file1Output
./level1dir7/file1
./level1dir1/file1
./level1dir3/file1
./level1dir8/file1
./level1dir6/file1
./file1
./level1dir2/file1
./level1dir9/file1
./level1dir4/file1
./level1dir5/file1
./level1dir10/file1这是一个非常易于管理的清单。.
如果您知道某个特定位置的所有文件都存在于当前目录下,则可以指定一个最小目录:
find -mindepth num -name query您可以使用此方法仅查找目录分支末尾的文件:
find -mindepth 4 -name file1Output
./level1dir7/level2dir8/level3dir9/file1
./level1dir7/level2dir8/level3dir3/file1
./level1dir7/level2dir8/level3dir4/file1
./level1dir7/level2dir8/level3dir1/file1
./level1dir7/level2dir8/level3dir8/file1
./level1dir7/level2dir8/level3dir7/file1
./level1dir7/level2dir8/level3dir2/file1
. . .同样,由于分支和文件结构,它会返回大量结果(1000)。.
您可以结合最小深度参数和最大深度参数,将目标范围缩小到较小的范围内:
find -mindepth 2 -maxdepth 3 -name file1Output
./level1dir7/level2dir8/file1
./level1dir7/level2dir5/file1
./level1dir7/level2dir7/file1
./level1dir7/level2dir2/file1
./level1dir7/level2dir10/file1
./level1dir7/level2dir6/file1
./level1dir7/level2dir3/file1
./level1dir7/level2dir4/file1
./level1dir7/file1
. . .这样组合这些选项将大大减少结果,只返回 110 行而不是之前的 1000 行。.
执行命令以查找结果
您可以使用该参数 -执行 使用以下命令对任何匹配项运行自定义辅助命令:
find find_parameters -exec command_and_options {} \;{} 用作匹配文件的占位符。\; 表示命令的结束位置。.
例如,假设您仍然位于上一步在 /tmp/ 文件夹中创建的 /test/ 目录中,您可以找到上一节中权限为 644 的文件,并将其权限更改为 664:
find . -type f -perm 644 -exec chmod 664 {} \;您也可以通过类似的方式更改目录权限:
find . -type d -perm 755 -exec chmod 700 {} \;此示例查找权限设置为 755 的所有目录,然后将权限更改为 700。.
使用定位功能查找文件
替代使用 寻找 命令 定位 该命令通常速度更快,并且可以轻松搜索整个文件系统。.
您可以通过更新 Debian 或 Ubuntu 的软件包列表,然后安装 molocate 软件包,使用 apt 命令来安装该命令:
sudo apt update sudo apt install mlocate
在 Rocky Linux、CentOS 和其他基于 RedHat 的发行版上,您可以使用 dnf 命令安装 mlocate:
sudo dnf install mlocatelocate 命令比 find 命令快的原因在于它依赖于一个列出文件系统中所有文件的数据库。该数据库通常每天通过 cron 脚本更新一次,但您也可以使用 updatedb 命令手动更新它。现在,请使用 sudo 权限运行此命令:
sudo updatedb请记住,如果要查找新文件,位置数据库必须始终保持最新状态。如果在 cron 脚本运行之前或 updatedb 命令运行之前添加新文件,这些文件将不会出现在查询结果中。.
位置功能允许您以多种方式筛选结果。查找文件的最基本方法是使用以下语法:
locate query这将匹配路径中包含字符串查询的任何文件或目录。要仅返回文件名包含查询本身的文件,而不是包含指向该查询的目录中所有包含查询的文件,您可以添加 -b 标志,仅搜索«基本名称»与查询匹配的文件:
locate -b query要使 locate 命令仅返回文件系统中仍然存在的结果(即在上次 updatedb 调用和当前 locate 调用之间未被删除的文件),请使用 -e 参数:
locate -e query您可以使用 -S 选项检索有关列出位置的信息的统计信息:
locate -SOutput
Database /var/lib/mlocate/mlocate.db:
21015 directories
136787 files
7727763 bytes in file names
3264413 bytes used to store database这有助于您大致了解系统上的文件和目录数量。.
结果
find 和 locate 都是查找系统文件的实用工具。它们都是功能强大的命令,可以通过管道与其他工具结合使用来增强其功能,但具体选择哪个工具取决于您的实际情况。我们鼓励您继续尝试使用 find 和 locate。您可以阅读它们各自的 man 手册,了解本指南中未涵盖的其他选项,还可以将搜索结果传递给其他命令(例如 wc、sort 和 grep)来分析和处理这些结果。.









