Liunx基础命令 - find命令

服务器 0

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个字符长的字符串,第一个和第三个字符为ab,而中间的字符可以是任何单一的字符。
  • 中括号([]):用于指定字符集合,匹配方括号内列出的任意一个字符。例如,[abc]可以匹配abc中的任意一个字符;[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的区别

findgrep 是常用的 Linux 命令,它们有一些相似之处,但也有一些本质的不同。

  • find 命令用于在指定目录中查找符合条件的文件,并可以执行相关的操作。可以使用多个查询条件对结果进行筛选,并且可以递归搜索子目录,支持使用逻辑运算符组合查询条件。例如,我们可以使用 find /path/to/search -name "*.txt" 命令查找 /path/to/search 目录下所有后缀名为 .txt 的文件。find 命令的返回结果是文件路径列表,不会显示文件内容。
  • grep 命令用于在指定文本文件中查找匹配的字符串,或者从标准输入流(即终端输入)读取数据并查找匹配的字符串。可以使用正则表达式进行匹配,并会输出匹配到的行。例如,我们可以使用 grep "hello" file.txt 命令在 file.txt 文件中查找包含 hello 字符串的行,并输出这些行。grep 命令的返回结果是包含匹配的文件行,不会显示其他非匹配的信息。
    综上所述,findgrep 命令的主要区别在于,find 主要用于查找文件,grep 主要用于查找文本内容。find 用于文件路径的搜索,返回文件路径列表,而 grep 用于文本内容匹配,返回包含匹配的文件行。

也许您对下面的内容还感兴趣: