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

介绍

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

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

按名称查找

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

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

find -name "query"

Copy

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

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

find -iname "query"

Copy

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

find -not -name "query_to_avoid"

Copy

或者

find \! -name "query_to_avoid"

Copy

按类型查找

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

find -type type_descriptor query

Copy

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

  • f : 普通文件
  • d:目录
  • l : 符号链接
  • c : 字符设备
  • b : 块设备

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

    find / -type c

Copy

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"

Copy

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

Copy

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

find / -size -50c

Copy

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

find / -size +700M

Copy

时间

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

  • 访问时间:上次读取或写入文件的时间。
  • 修改时间:上次修改文件内容的时间。
  • 更改时间:上次更改文件的 inode 元数据的时间。

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

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

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

find / -mtime 1

Copy

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

find / -atime -1

Copy

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

find / -ctime +3

Copy

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

find / -mmin -1

Copy

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

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

find / -newer myfile

Copy

按所有者和权限查找

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

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

find / -user syslog

Copy

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

find / -group shadow

Copy

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

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

find / -perm 644

Copy

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

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

find / -perm -644

Copy

这将匹配任何具有额外权限的文件。在这种情况下,将匹配具有“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

Copy

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

cd ~/test

Copy

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

find -name file1

Copy

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

Copy

Output1111

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

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

find -maxdepth num -name query

Copy

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

find -maxdepth 2 -name file1

Copy

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

Copy

我们可以使用它来仅查找目录分支末尾的文件:

find -mindepth 4 -name file

Copy

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

Copy

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 {} \;

Copy

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

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

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

Copy

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

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

Copy

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

find . -name file1 -or -name file9

Copy

使用定位查找文件

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

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

sudo apt install mlocate

Copy

在 CentOS 上,dnf改为使用:

sudo dnf install mlocate

Copy

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

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

sudo updatedb

Copy

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

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

locate query

Copy

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

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

locate -b query

Copy

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

locate -e query

Copy

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

locate -S

Copy

OutputDatabase /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

Z2ER大部分下载资源收集于网络,只做学习和交流使用,版权归原作者所有,请在下载后24小时之内自觉删除,若作商业用途,请购买正版,由于未及时购买和付费发生的侵权行为,与Z2ER无关。本站发布的内容若侵犯到您的权益,请联系z2er@z2er.com删除,将及时处理!
Z2ER » 如何使用 Find 和 Locate 在 Linux 上搜索文件