如何使用查找和定位功能在 Linux 上搜索文件

介绍

用户第一次学习如何使用Linux时遇到的一个问题是如何找到他们正在寻找的文件。

本指南将涵盖如何使用适当的名为找到的命令. 这将帮助您使用各种过滤器和参数在您的系统上搜索文件. 它还将简短地涵盖找到命令,可以用来以不同的方式搜索文件。

前提条件

要跟随这个指南,你需要访问运行基于Linux的操作系统的计算机. 它可以是一个虚拟的私人服务器,你已经连接到SSH或你的本地机器. 请注意,本教程是通过使用运行Ubuntu 20.04的Linux服务器验证的,但所示的例子应该在运行任何Linux发行版的计算机上工作。

如果您打算使用远程服务器来遵循本指南,我们建议您先完成我们的 初始服务器设置指南

<$>[注] :为了说明找到找到命令的工作,本指南中的示例命令搜索存储在/root目录中的文件。

这是可以预见的,因为您正在搜索普通用户通常无法访问的目录中的文件,然而,这些示例命令仍然应该工作,并有助于了解这些程序是如何工作的。

以名字寻找

搜索文件的最明显的方式是他们的名字。

要按名称找到一个文件,使用查找命令,你会使用以下语法:

1find -name "query"

这将是案例敏感,这意味着对查询的搜索与对查询的搜索不同。

若要按名称查找文件,但忽略查询的案例,请使用 -iname 选项:

1find -iname "query"

如果你想找到不符合特定模式的所有文件,你可以用扭转搜索:

1find -not -name "query_to_avoid"

或者,您可以使用一个呼声点(!)来逆转搜索,如下:

1find \! -name "query_to_avoid"

请注意,如果您使用了 !,则必须用后滑(\)来逃避该字符,以便壳在查找之前不会试图解释它。

寻找类型

您可以指定您想要找到的文件类型,使用类型参数。

1find -type type_descriptor query

以下是您可以使用的一些描述器来指定文件类型:

  • f:正规文件
  • d:目录
  • l:符号链接
  • c:字符设备
  • b:区块设备

例如,如果您想找到系统上的所有字符设备,您可以发出以下命令:

1find /dev -type c

这个命令只在/dev目录中搜索设备,该目录通常在Linux系统中安装设备文件:

 1[secondary_label Output]
 2/dev/vcsa5
 3/dev/vcsu5
 4/dev/vcs5
 5/dev/vcsa4
 6/dev/vcsu4
 7/dev/vcs4
 8/dev/vcsa3
 9/dev/vcsu3
10/dev/vcs3
11/dev/vcsa2
12/dev/vcsu2
13/dev/vcs2
14. . .

您可以使用如下命令搜索以 .conf 结束的所有文件. 此示例在 /usr 目录中搜索匹配的文件:

1find /usr -type f -name "*.conf"
 1[secondary_label Output]
 2/usr/src/linux-headers-5.4.0-88-generic/include/config/auto.conf
 3/usr/src/linux-headers-5.4.0-88-generic/include/config/tristate.conf
 4/usr/src/linux-headers-5.4.0-90-generic/include/config/auto.conf
 5/usr/src/linux-headers-5.4.0-90-generic/include/config/tristate.conf
 6/usr/share/adduser/adduser.conf
 7/usr/share/ufw/ufw.conf
 8/usr/share/popularity-contest/default.conf
 9/usr/share/byobu/keybindings/tmux-screen-keys.conf
10/usr/share/libc-bin/nsswitch.conf
11/usr/share/rsyslog/50-default.conf
12. . .

<$>[注] :前面的示例结合了两个查找查询表达式,即类型 f名称*.conf。

您可以通过将它们与-and选项分开来组合这样的表达式,但正如本示例所示,-and随时被暗示,您可以包括两个表达式,您也可以通过将它们与-or选项分开来返回满足 ** 两个** 表达式的结果:

1find -name query_1 -or -name query_2

此示例会找到任何文件,其名称匹配Query_1Query_2

按时间和尺寸过滤

查找为您提供了多种方式来按大小和时间过滤结果。

尺寸

您可以使用大小参数来过滤文件大小。 要做到这一点,您必须在数字大小值的末尾添加一个特殊的附加字符,以表明您是否在以字节、兆字节、兆字节或其他大小计算大小。

  • c:字节
  • k:千字节
  • M:千字节
  • G:千字节
  • b: 512字节块

如图所示,下面的命令会找到 /usr 目录中的每个文件,该文件是准确的 50 字节:

1find /usr -size 50c

若要查找小于 50 字节的文件,可以使用以下语法:

1find /usr -size -50c

要在 /usr 目录中找到超过 700 兆字节的文件,您可以使用以下命令:

1find /usr -size +700M

时间

对于系统上的每个文件,Linux会存储有关访问时间、修改时间和更改时间的时间数据。

  • ** 访问时间**: 最后一次读取或写入文件时。
  • ** 修改时间**: 最后一次修改文件内容时。

您可以根据这些参数进行查找搜索,分别使用-atime-mtime-ctime选项。对于任何这些选项,您必须传递一个指示过去您想要搜索的天数的值。

例如,要在上一天內修改的 `/usr 目錄中的檔案,請執行以下命令:

1find /usr -mtime 1

如果您想要在不到一天前访问的文件,您可以运行此命令:

1find /usr -atime -1

要查找上次更改其元信息的文件超过3天前,您可以执行以下操作:

1find /usr -ctime +3

这些选项还具有伴侣参数,您可以使用它们来指定分钟而不是天:

1find /usr -mmin -1

这将提供在最后一分钟修改的文件。

'find' 还可以对参考文件进行比较,并返回更新的文件:

1find / -newer reference_file

此语法将返回系统上创建或更改的每个文件,而不是参考文件。

寻找所有者和许可证

您也可以使用相应的用户参数来搜索拥有该文件的用户或组的文件。 要在/var目录中找到所有属于 syslog用户的每个文件,请执行以下命令:

1find /var -user syslog

同样,您可以通过键入在 shadow 组所拥有的 /etc 目录中的文件:

1find /etc -group shadow

您还可以搜索具有特定权限的文件。

如果您想要匹配准确的权限集,则可以使用此语法,使用十字节符号指定权限:

1find / -perm 644

这将与指定权限的文件完全匹配。

如果您想指定任何具有至少这些权限的 **,则可以以减数符号提前权限标记:

1find / -perm -644

这将匹配任何具有额外权限的文件. 在这种情况下,将匹配具有744权限的文件。

过滤深度

在本节中,您将创建一个示例目录结构,然后使用它来根据其结构中的深度探索过滤文件。

如果你遵循本教程中的示例,那么在 /tmp/ 目录中创建这些文件和目录是明智的。 /tmp/ 是一个临时目录,这意味着在服务器下次启动时,任何文件和目录都将被删除。

在运行本节中的命令后,您的 /tmp/ 目录将包含三个级别的目录,第一个级别有十个目录.每个目录(包括临时目录)将包含十个文件和十个子目录。

/tmp/ 目录中使用以下命令创建示例目录结构:

1mkdir -p /tmp/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}

接下来,用触摸命令填充这些目录一些样本文件:

1touch /tmp/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}}

有了这些文件和目录,继续浏览您刚刚创建的‘测试/’目录:

1cd /tmp/test

要了解找到如何从这个结构中获取文件,请开始使用一个常规的名称搜索,以匹配任何名为file1的文件:

1find -name file1
 1[secondary_label Output]
 2./level1dir7/level2dir8/level3dir9/file1
 3./level1dir7/level2dir8/level3dir3/file1
 4./level1dir7/level2dir8/level3dir4/file1
 5./level1dir7/level2dir8/level3dir1/file1
 6./level1dir7/level2dir8/level3dir8/file1
 7./level1dir7/level2dir8/level3dir7/file1
 8./level1dir7/level2dir8/level3dir2/file1
 9./level1dir7/level2dir8/level3dir6/file1
10./level1dir7/level2dir8/level3dir5/file1
11./level1dir7/level2dir8/file1
12. . .

如果你将输出输入到计数器中,你会发现有1111总结果:

1find -name file1 | wc -l
1[secondary_label Output]
21111

在大多数情况下,这可能太多的结果对您有用了. 为了缩小它,您可以在顶级搜索目录中指定搜索的最大深度:

1find -maxdepth num -name query

若要仅在级别1目录和以上目录中找到file1,您可以指定最大深度为2(1为顶级目录,1为级别1目录):

1find -maxdepth 2 -name file1
 1[secondary_label Output]
 2./level1dir7/file1
 3./level1dir1/file1
 4./level1dir3/file1
 5./level1dir8/file1
 6./level1dir6/file1
 7./file1
 8./level1dir2/file1
 9./level1dir9/file1
10./level1dir4/file1
11./level1dir5/file1
12./level1dir10/file1

这是一个更易于管理的清单。

您也可以指定最小的目录,如果您知道所有文件都存在于当前目录的某个特定点:

1find -mindepth num -name query

您可以使用此方法只在目录分支的末尾找到文件:

1find -mindepth 4 -name file1
1[secondary_label Output]
2./level1dir7/level2dir8/level3dir9/file1
3./level1dir7/level2dir8/level3dir3/file1
4./level1dir7/level2dir8/level3dir4/file1
5./level1dir7/level2dir8/level3dir1/file1
6./level1dir7/level2dir8/level3dir8/file1
7./level1dir7/level2dir8/level3dir7/file1
8./level1dir7/level2dir8/level3dir2/file1
9. . .

再次,由于分支目录结构,这将返回大量的结果(1000)。

您可以将min和max深度参数结合起来,以便专注于一个狭窄的范围:

1find -mindepth 2 -maxdepth 3 -name file1
 1[secondary_label Output]
 2./level1dir7/level2dir8/file1
 3./level1dir7/level2dir5/file1
 4./level1dir7/level2dir7/file1
 5./level1dir7/level2dir2/file1
 6./level1dir7/level2dir10/file1
 7./level1dir7/level2dir6/file1
 8./level1dir7/level2dir3/file1
 9./level1dir7/level2dir4/file1
10./level1dir7/file1
11. . .

将这些选项相结合,将结果大大缩小,只返回110行,而不是前1000行。

查找结果上执行命令

您可以通过使用下面的语法执行任意辅助命令对任何找到匹配的内容,使用-exec参数:

1find find_parameters -exec command_and_options {} \;

{}被用作Find匹配的文件的位置保留器,而\;允许Find知道命令的终点。

例如,假设您在上一个步骤中创建的 /tmp/ 目录中的 test/ 目录中,您可以在上一个部分中找到具有 644 权限的文件,并将其修改为 664 权限:

1find . -type f -perm 644 -exec chmod 664 {} \;

您也可以以类似的方式更改目录权限:

1find . -type d -perm 755 -exec chmod 700 {} \;

此示例会找到每个设置为755的权限的目录,然后将权限修改为700

使用Locate查找文件

使用找到的替代方法是找到命令,这个命令往往更快,可以轻松搜索整个文件系统。

您可以在 Debian 或 Ubuntu 上安装apt命令,更新您的包列表,然后安装mlocate包:

1sudo apt update
2sudo apt install mlocate

在 Rocky Linux、CentOS 和其他 RedHat 衍生发行版中,您可以使用dnf命令来安装mlocate:

1sudo dnf install mlocate

找到找到更快的原因是因为它依赖于列出文件系统中的所有文件的数据库,该数据库通常每天更新一次,但您可以使用updatedb命令手动更新它。

1sudo updatedb

请记住,如果您在执行 cron 脚本或运行updatedb命令之前添加新文件,则它们不会出现在查询结果中。

定位允许您以多种方式过滤结果,您可以使用它来找到文件的最基本方式是使用以下语法:

1locate query

要返回只有包含查询本身的名称的文件,而不是每个包含查询的文件,您可以包含b标志来搜索只有与查询相匹配的基名的文件:

1locate -b query

要将找到只返回文件系统中仍然存在的结果(即在最后一次更新b呼叫和当前的找到呼叫之间未删除的文件),请使用e旗:

1locate -e query

您可以使用-S选项获取Locate目录的信息统计数据:

1locate -S
1[secondary_label Output]
2Database /var/lib/mlocate/mlocate.db:
3    21015 directories
4    136787 files
5    7727763 bytes in file names
6    3264413 bytes used to store database

这可以帮助您了解系统上有多少文件和目录。

结论

查找查找命令都是在您的系统上找到文件的有用的工具,它们都是强大的命令,可以通过管道将它们与其他实用程序相结合,但您可以决定哪个工具适合您的特定情况。

您可以阅读其各自的页面,了解本指南未涵盖的其他选项,您可以分析和操纵搜索结果,将其输入到其他命令中,如wc,sortgrep

Published At
Categories with 技术
comments powered by Disqus