介绍
用户在第一次使用 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
随意查看目录结构ls
并cd
了解事物的组织方式。完成后,返回测试目录:
- 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
Output1111
在大多数情况下,这可能是太多的结果而对您没有用。让我们试着缩小范围。
可以在顶级搜索目录下指定最大搜索深度:
- 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
使用定位查找文件
使用的替代方法find
是locate
命令。此命令通常更快,并且可以轻松搜索整个文件系统。
您可以使用以下命令在 Debian 或 Ubuntu 上安装该命令apt
:
- sudo apt install mlocate
在 CentOS 上,dnf
改为使用:
- sudo dnf install mlocate
原因locate
比find
因为它依赖于文件系统上的文件数据库更快。
数据库通常每天使用 cron 脚本更新一次,但您可以通过键入以下内容手动更新:
- sudo updatedb
现在运行这个命令。请记住,如果您想查找最近获取或创建的文件,数据库必须始终是最新的。
要使用 locate 查找文件,只需使用以下语法:
- locate query
您可以通过某些方式过滤输出。
例如,要仅返回包含查询本身的文件,而不是返回指向它的目录中包含查询的每个文件,您可以使用-b
for only 搜索“basename”:
- locate -b query
要仅定位仍存在于文件系统中的返回结果(在上次updatedb
调用和当前locate
调用之间未删除的结果),请使用以下-e
标志:
- locate -e query
要查看有关 locate 已编目的信息的统计信息,请使用以下-S
选项:
- locate -S
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 是强大的命令,可以通过管道将它们与其他实用程序结合使用来增强它们。通过使用像命令过滤实验wc
,sort
和grep
。