find命令 – 根据路径和条件搜索指定文件
find命令的功能是用于根据给定的路径和条件查找相关文件或目录,参数灵活方便,且支持正则表达式,结合管道符后能够实现更加复杂的功能,是Linux系统运维人员日常工作必须掌握的命令之一。
find命令通常进行的是从根目录(/)开始的全盘搜索,有别于whereis、which、locate……等的有条件或部分文件的搜索。对于服务器负载较高的情况,建议不要在高峰时期使用find命令的模糊搜索,会相对消耗较多的系统资源。
语法格式:find [路径] [条件] 文件名
常用参数:
| -name | 匹配文件名 |
|---|---|
| -perm | 匹配文件权限 |
| -user | 匹配文件所属主 |
| -group | 匹配文件所属组 |
| -mtime | 匹配最后修改文件内容时间 |
| -atime | 匹配最后读取文件内容时间 |
| -ctime | 匹配最后修改文件属性时间 |
| -nouser | 匹配无所属主的文件 |
| -nogroup | 匹配无所属组的文件 |
| -newer | 匹配比指定文件更新的文件 |
| -type | 匹配文件类型 |
| -size | 匹配文件大小 |
| -prune | 不搜索指定目录 |
| -exec …… {}; | 进一步处理搜索结果 |
操作示例

find -name a命令的意思是在当前目录及其子目录中查找文件名为a的文件,并将它们输出。其中,-name参数指定查找的文件名,可以使用通配符匹配多个文件。
find -name 'a*'命令的意思是在当前目录及其子目录中查找文件名以字母’a’开头的文件,并将它们输出。其中,-name参数指定查找的文件名,通配符*表示匹配0个或多个字符。find -name 'a*'命令为什么要在a*上加引号???
Linux命令行中的通配符(wildcard)可以用来匹配文件名或目录名,以便更方便地搜索和操作文件。其中,
*表示匹配任意多个字符,包括0个字符。而在Linux命令中,命令参数如果带有空格或特殊字符等,会被解释器当作多个参数处理,因此需要使用引号将其整体引起来,避免解释器解释错误。因此,在
find -name 'a*'命令中,'a*'被引号括起来,是为了防止解释器将其拆分成多个参数。这样在搜索文件时可以正确地匹配所有文件名以字母a开头的文件,且保证命令解析正确。

? 匹配任意一个字符

[]匹配任意一个中括号内的字符
在Linux find命令中,星号(*)、问号(?)和中括号([])都是通配符,用于匹配文件名。
- 星号(
*):匹配任意数量的字符。例如,*.txt可以匹配所有以.txt结尾的文件。 - 问号(
?):匹配单个字符。例如,a?b可以匹配所有的3个字符长的字符串,第一个和第三个字符为a和b,而中间的字符可以是任何单一的字符。 - 中括号(
[]):用于指定字符集合,匹配方括号内列出的任意一个字符。例如,[abc]可以匹配a、b或c中的任意一个字符;[0-9]则可以匹配任意一个数字字符。
它们的主要区别在于匹配的范围和粒度不同:
- 星号(
*)匹配的是任意数量的字符,包括0个或多个,是最广泛的匹配方式; - 问号(
?)则只匹配一个字符,是比较精确的匹配方式; - 中括号(
[])用于指定字符集合,在给定的字符中进行匹配,是介于两者之间的匹配方式。
因此,在使用find命令时,需要根据实际情况选择合适的通配符来进行文件名匹配。可以根据需要组合使用这些通配符来实现更精确的匹配。
按时间查询

在Linux
find命令中,可以使用-mtime选项以修改时间为条件查询文件。其中,-mtime +n表示查找修改时间在n天之前的文件,-mtime n表示查找修改时间恰好为n天前的文件,-mtime -n表示查找修改时间在n天之内的文件(包括当天)。因此,具体到本题中,
+2表示修改时间在2天之前的文件,即查找至少2天前修改过的文件;2表示修改时间恰好为2天前的文件;-2表示修改时间在2天内的文件,即查找最近2天内修改过的文件。

在Linux
find命令中,除了可以使用-mtime选项以修改时间为条件查询文件外,还可以使用-atime和-ctime选项以访问时间和状态更改时间为条件查询文件。其中,
-atime n表示查找最近n天内被访问过的文件,-ctime n表示查找最近n天内状态更改过的文件。这些选项也可以通过添加+或-来表示时间范围。
按大小查询

find -size 2k表示在当前目录下查找大小为2KB的文件,并将这些文件列出来。在find命令中,-size选项用于按照文件大小进行查询,2k指定要查找的文件大小为2KB。需要注意的是,在文件大小计量单位中,
k表示千字节(KB)的意思,因此2k就表示2KB。此外,还可以使用其他后缀来表示不同的计量单位,如c表示字节数,M表示兆字节(MB),G表示千兆字节(GB)等。这个查询出来的不太精确
复合查询

复合查询指在
find命令中可以同时使用多个选项对文件进行多条件查询的方式。常见的复合查询包括按文件名、大小、类型、时间等条件组合进行查找。在复合查询的命令中就会出现并且,或者,除非的关系
在
find命令中,我们可以使用-a选项表示“并且”,使用-o选项表示“或者”,使用!表示“除非”。find /etc -size +20k -a -size -50k 其作用是在
/etc目录下查找文件大小大于 20KB 且小于 50KB 的文件。具体解释如下:
find:表示查找命令。/etc:查找的目录是/etc,即从/etc目录开始往下查找符合条件的文件。-size +20k:指定文件大小大于 20KB,其中+表示大于,20k表示 20KB,这里的大小指的是文件占用的磁盘空间。-a:表示多个查询条件通过逻辑“与”连接,即查询的文件必须同时满足两个条件,即大小大于 20KB 和小于 50KB。-size -50k:指定文件大小小于 50KB,其中-表示小于,50k表示 50KB,这里的大小指的是文件占用的磁盘空间。
find与grep的区别
find和grep是常用的 Linux 命令,它们有一些相似之处,但也有一些本质的不同。
find命令用于在指定目录中查找符合条件的文件,并可以执行相关的操作。可以使用多个查询条件对结果进行筛选,并且可以递归搜索子目录,支持使用逻辑运算符组合查询条件。例如,我们可以使用find /path/to/search -name "*.txt"命令查找/path/to/search目录下所有后缀名为.txt的文件。find命令的返回结果是文件路径列表,不会显示文件内容。grep命令用于在指定文本文件中查找匹配的字符串,或者从标准输入流(即终端输入)读取数据并查找匹配的字符串。可以使用正则表达式进行匹配,并会输出匹配到的行。例如,我们可以使用grep "hello" file.txt命令在file.txt文件中查找包含hello字符串的行,并输出这些行。grep命令的返回结果是包含匹配的文件行,不会显示其他非匹配的信息。
综上所述,find和grep命令的主要区别在于,find主要用于查找文件,grep主要用于查找文本内容。find用于文件路径的搜索,返回文件路径列表,而grep用于文本内容匹配,返回包含匹配的文件行。








![[学习笔记] [机器学习] 5. 逻辑回归(逻辑回归、混淆矩阵、分类评估指标、ROC曲线、AUC指标、类别不均衡问题)](https://img-blog.csdnimg.cn/13f9b16cf4834c4bb0d510c3bda20489.png#pic_center)









