find
是一个基于条件机制递归过滤文件系统中对象的命令。使用find
搜索文件系统中的文件或目录。使用-exec
标志,可以在同一命令中找到并立即处理文件。
使用find
命令行按名称或扩展名查找特定文件。下面的示例是在/home/username/
中查到以.err
结尾的所有文件:
find /home/username/ -name "*.err"
find
表达式采用以下形式:
find options starting/path expression
options
属性将控制find
进程的行为和优化方法。starting/path
属性将定义find
开始过滤的顶级目录。expression
属性控制搜索目录层次结构以生成输出的测试。下面是示例命令:
find -O3 -L /var/www/ -name "*.html"
此命令启用最大优化级别(-O3)并允许find
遵循符号链接(-L
)。在/var/www/
下面的整个目录树中搜索以.html
结尾的文件。
命令 | 描述 |
---|---|
find . -name testfile.txt | 在当前和子目录中找到名为testfile.txt的文件。 |
find /home -name *.jpg | 在/home中查找所有以.jpg结尾的文件 |
find . -type f -empty | 在当前目录中查找空文件。 |
find /home -user exampleuser -mtime 7 -iname ".db" | 查找用户名为exampleuser的用户在过去7天内修改的所有.db文件(忽略文本大小写)。 |
默认配置find
将忽略快捷方式文件。如果要find
跟随并返回符号链接,可以将-L
选项添加到命令中,如上例所示。
find
优化其过滤策略以提高性能。三个可供用户选择的优化级别被指定为-O1
,-O2
和-O3
。在运行所有其他测试之前,-O1
优化是默认值并强制find
基于文件名进行过滤。
在-02
级别上的优化优先考虑文件名过滤器,就像在-01
中一样,然后在处理其他更占用资源的条件之前运行所有文件类型过滤。级别-03
优化允许find执行最严格的优化,并根据相关费用和成功的可能性重新安排所有测试。
命令 | 描述 |
---|---|
-O1 | (默认)首先根据文件名过滤。 |
-O2 | 首先是文件名,然后是文件类型。 |
-O3 | 允许find根据资源和可能性的有效使用自动重新排序搜索。成功 |
-maxdepth X | 搜索当前目录以及所有X级别的子目录。 |
-iname | 搜索时不考虑文本情况。 |
-not | 仅返回与测试用例不匹配的结果。 |
-type f | 搜索文件。 |
-type d | 搜索目录。 |
find
命令包含根据上次修改文件的时间过滤目录层次结构的功能:
find / -name "*conf" -mtime 7
find /home/exampleuser/ -name "*conf" -mtime 3
第一个命令返回整个文件系统中所有文件的列表,这些文件以字符conf
结尾并在过去7天内被修改。第二个命令过滤exampleuser
用户的主目录,查找名称以conf
字符结尾并在前3天内被修改的文件。
该find
命令只能根据文件名和元数据过滤目录层次结构。如果您需要根据文件内容进行搜索,请使用grep
等工具。请考虑以下示例:
find . -type f -exec grep "example" '{}' \; -print
这将搜索当前目录层次结构(.
)中的每个文件(-type f
),然后为每个满足条件的文件运行grep“example”
命令。匹配的文件打印在屏幕上(-print
)。花括号({}
)是查找匹配结果的占位符。{}
用单引号('
)括起来,以避免将格式不正确的文件名传递给grep
。exec
命令以分号(;
)结束,分号应该转义(\;
),以避免shell
对其进行解释。
在执行-exec
选项之前,这种命令可能已使用xargs
命令生成类似的输出:
find . -type f -print | xargs grep "example"
exec
选项对匹配find
表达式的每个对象运行命令。考虑下面的例子::
find . -name "rc.conf" -exec chmod o+r '{}' \;
这将为命名为rc
的文件过滤当前层次结构(.
)中的每个对象。运行chmod o+r
命令修改查找结果的文件权限。
与-exec
一起运行的命令在find进程的根目录中执行。使用-execdir
在匹配所在的目录中执行指定的命令。这可能会减轻安全问题,并为某些操作产生更理想的性能。
-exec
或-execdir
选项运行时没有进一步提示。如果您希望在采取行动之前得到提示,请将-exec
替换为-ok
或-execdir
替换为-okdir
。
警告 请谨慎使用此选项。
将-delete
选项添加到匹配表达式的末尾,这样就能删除所有匹配的文件。请务必确定查找结果与您要删除的文件匹配。
在以下示例中,find
查找从当前目录开始并完全递归到目录树中的层次结构中的所有文件。在此示例中,find
将删除以.bak
字符结尾的所有文件:
find . -name "*.bak" -delete
怎样,你学会了嘛?赶快购买服务器尝试下吧! 想要学习更多相关知识,请访问腾讯云云+社区。
参考文献:《Find Files in Linux, Using the Command Line》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。