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
用于文本内容匹配,返回包含匹配的文件行。