介绍
用户第一次学习如何使用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_1
或Query_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
,sort
和grep
。