如何使用 Find 和 Locate 在 Linux 上搜索文件

介绍

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

本指南将介绍如何使用恰当命名的find命令。这将帮助您使用各种过滤器和参数搜索 VPS 上的文件。我们还将简要介绍该locate命令,该命令可用于以不同方式搜索文件。

按名称查找

搜索文件最明显的方法是按名称。

要按名称查找文件,请键入:

  • find -name "query"

这将区分大小写,这意味着搜索与搜索file不同File

要按名称查找文件,但忽略查询的大小写,请键入:

  • find -iname "query"

如果要查找不符合特定模式的所有文件,可以使用-not反转搜索!如果使用!,则必须对字符进行转义,以便 bash 不会在 find 起作用之前尝试解释它:

  • find -not -name "query_to_avoid"

或者

  • find \! -name "query_to_avoid"

按类型查找

您可以使用-type参数指定要查找的文件类型它是这样工作的:

  • find -type type_descriptor query

您可以用来指定文件类型的一些最常见的描述符如下:

  • f : 普通文件

  • d:目录

  • l : 符号链接

  • c : 字符设备

  • b : 块设备

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

  • find / -type c
Output
/dev/parport0 /dev/snd/seq /dev/snd/timer /dev/autofs /dev/cpu/microcode /dev/vcsa7 /dev/vcs7 /dev/vcsa6 /dev/vcs6 /dev/vcsa5 /dev/vcs5 /dev/vcsa4 . . .

我们可以搜索所有以这样结尾的文件.conf

  • find / -type f -name "*.conf"
Output
/var/lib/ucf/cache/:etc:rsyslog.d:50-default.conf /usr/share/base-files/nsswitch.conf /usr/share/initramfs-tools/event-driven/upstart-jobs/mountall.conf /usr/share/rsyslog/50-default.conf /usr/share/adduser/adduser.conf /usr/share/davfs2/davfs2.conf /usr/share/debconf/debconf.conf /usr/share/doc/apt-utils/examples/apt-ftparchive.conf . . .

按时间和大小过滤

Find 为您提供了多种按大小和时间过滤结果的方法。

尺寸

您可以使用-size参数按大小过滤

我们在值的末尾添加一个后缀,指定我们如何计数。这些是一些流行的选项:

  • c : 字节

  • k : 千字节

  • M : 兆字节

  • G : 千兆字节

  • b : 512 字节块

要查找正好为 50 个字节的所有文件,请键入:

  • find / -size 50c

要查找所有小于 50 字节的文件,我们可以改用这种形式:

  • find / -size -50c

要查找所有超过 700 MB 的文件,我们可以使用以下命令:

  • find / -size +700M

时间

Linux 存储有关访问时间、修改时间和更改时间的时间数据。

  • 访问时间:上次读取或写入文件的时间。

  • 修改时间:上次修改文件内容的时间。

  • 更改时间:上次更改文件的 inode 元数据的时间。

我们可以使用这些-atime-mtime-ctime参数。这些可以使用加号和减号来指定大于或小于,就像我们在 size 中所做的那样。

此参数的值指定您要搜索多少天前。

要查找修改时间为一天前的文件,请键入:

  • find / -mtime 1

如果我们想要在不到一天前访问过的文件,我们可以输入:

  • find / -atime -1

要获取上次更改元信息超过 3 天的文件,请键入:

  • find / -ctime +3

我们还可以使用一些伴随参数来指定分钟而不是天:

  • find / -mmin -1

这将使已修改的文件在最后一分钟输入系统。

Find 还可以与参考文件进行比较并返回较新的文件:

  • find / -newer myfile

按所有者和权限查找

您还可以按文件所有者或组所有者搜索文件。

您可以分别使用-user-group参数来执行此操作通过输入以下命令查找“syslog”用户拥有的文件:

  • find / -user syslog

同样,我们可以通过键入以下内容来指定“shadow”组拥有的文件:

  • find / -group shadow

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

如果我们想匹配一组精确的权限,我们使用这种形式:

  • find / -perm 644

这将匹配具有指定权限的文件。

如果我们想指定至少具有这些权限的任何内容,您可以使用以下形式:

  • find / -perm -644

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

按深度过滤

对于本节,我们将在临时目录中创建一个目录结构。它将包含三层目录,第一层有十个目录。每个目录(包括临时目录)将包含十个文件和十个子目录。

通过发出以下命令来创建此结构:

  • cd
  • mkdir -p ~/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}
  • touch ~/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}}
  • cd ~/test

随意查看目录结构lscd了解事物的组织方式。完成后,返回测试目录:

  • cd ~/test

我们将研究如何从此结构返回特定文件。让我们先尝试一个仅进行常规名称搜索的示例,以进行比较:

  • find -name file1
Output
./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 -l
Output
1111

在大多数情况下,这可能是太多的结果而对您没有用。让我们试着缩小范围。

可以在顶级搜索目录下指定最大搜索深度:

  • find -maxdepth num -name query

要仅在“level1”及以上目录中查找“file1”,您可以指定最大深度为 2(顶级目录为 1,level1 目录为 1):

  • find -maxdepth 2 -name file1
Output
./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 file
Output
./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 file
Output
./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 . . .

执行和组合查找命令

您可以使用-exec参数对找到匹配项的所有内容执行任意帮助命令这是这样调用的:

  • find find_parameters -exec command_and_params {} \;

{}用作该找到匹配的文件的占位符。\;被使用,以便查找知道命令结束的位置。

例如,我们可以找到上一节中具有644权限的文件并将其修改为具有664权限:

  • cd ~/test
  • find . -type f -perm 644 -exec chmod 664 {} \;

然后我们可以像这样更改目录权限:

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

如果要将不同的结果链接在一起,可以使用-and-or命令。-and假设如果忽略。

  • find . -name file1 -or -name file9

使用定位查找文件

使用的替代方法findlocate命令。此命令通常更快,并且可以轻松搜索整个文件系统。

您可以使用以下命令在 Debian 或 Ubuntu 上安装该命令apt

  • sudo apt install mlocate

在 CentOS 上,dnf改为使用

  • sudo dnf install mlocate

原因locatefind因为它依赖于文件系统上的文件数据库更快

数据库通常每天使用 cron 脚本更新一次,但您可以通过键入以下内容手动更新:

  • sudo updatedb

现在运行这个命令。请记住,如果您想查找最近获取或创建的文件,数据库必须始终是最新的。

要使用 locate 查找文件,只需使用以下语法:

  • locate query

您可以通过某些方式过滤输出。

例如,要仅返回包含查询本身的文件,而不是返回指向它的目录中包含查询的每个文件,您可以使用-bfor only 搜索“basename”:

  • locate -b query

要仅定位仍存在于文件系统中的返回结果(在上次updatedb调用和当前locate调用之间未删除的结果),请使用以下-e标志:

  • locate -e query

要查看有关 locate 已编目的信息的统计信息,请使用以下-S选项:

  • locate -S
Output
Database /var/lib/mlocate/mlocate.db: 3,315 directories 37,228 files 1,504,439 bytes in file names 594,851 bytes used to store database

结论

find 和 locate 都是在系统上查找文件的好方法。由您决定哪种工具适合每种情况。

Find 和 locate 是强大的命令,可以通过管道将它们与其他实用程序结合使用来增强它们。通过使用像命令过滤实验wcsortgrep

觉得文章有用?

点个广告表达一下你的爱意吧 !😁