欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

Linux的find命令

程序员文章站 2022-05-17 16:53:19
命令解释 find -- 在目录层次结构中搜索文件 -- linux下参数最多,最为复杂的命令 命令语法 find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression] 常见示例 基于目录深度的查找 基于文件系统的查找 基于最后 ......

命令解释

find

  -- 在目录层次结构中搜索文件

  -- linux下参数最多,最为复杂的命令

命令语法

 find [-h] [-l] [-p] [-d debugopts] [-olevel] [path...] [expression]

 

常见示例

基于目录深度的查找

find /etc/ -mindepth 1 -type f                # 查找/etc目录后至少1个子目录深度的所有文件
find /etc/ -maxdepth 1 -type f                # 查找/etc目录后至多1个子目录深度的所有文件
# 这招根据目录成熟设定范围很好用

 

基于文件系统的查找

find / -mount                                # 这招可以屏蔽其他分区的文件搜索

 

基于最后一次访问时间查找

find / -amin -60                              # 最后一次访问时间在60分钟之内的文件或者目录
find / -atime -2                              # 最后一次访问时间在24*2小时之内的文件或者目录
find / -mount -anewer /root/anaconda-ks.cfg    # 最后一次访问时间最接近anaconda-ks.cfg文件的最后一次访问时间的文件

 

基于最后一次状态更改时间查找

find / -cmin -60                              # 最后一次状态更改时间在60分钟之内的文件或者目录
find / -ctime -2                              # 最后一次状态更改时间在24*2小时之内的文件或者目录
find / -mount -cnewer /root/anaconda-ks.cfg    # 最后一次状态更改时间最接近anaconda-ks.cfg文件的最后一次访问时间的文件

 

基于最后一次内容修改时间查找

find / -mmin -60                              # 最后一次内容修改时间在60分钟之内的文件或者目录
find / -mtime -2                              # 最后一次内容修改时间在24*2小时之内的文件或者目录
find / -mount -newer /root/anaconda-ks.cfg    # 最后一次内容修改时间最接近anaconda-ks.cfg文件的最后一次访问时间的文件

 

基于文件大小查找

find / -mount -empty                        # 空目录或者空文件查找
find / -size -512b                            # 查找根目录下面大小在512bit以内的文件或者目录
find / -size +1024c                            # 查找根目录下面大于1024字节的文件或者目录
find / -size 1024k                            # 查找根目录下面等于1024k的文件或者目录
find / -size +500m                            # 查找根目录下面大于500m的文件或者目录
find / -size +1g                            # 查找根目录下面等于1g的文件或者目录

 

基于权限大小查找

find / -executable                            # 查找根目录分区下面可执行的文件或者可搜索的目录
find / -gid 0                                # 查找超级用户组所拥有的文件或者目录
find / -uid 0                                # 查找超级用户所拥有的文件或者目录
find / -group root                            # 查找root用户组所拥有的文件或者目录
find / -nogroup root                        # 查找非root用户组所拥有的文件或者目录
find / -nouser root                            # 查找非root用户所拥有的文件或者目录
find / -perm 755                            # 查找权限是755的文件或者目录
find / -perm 4755                            # 查找权限属主中带有粘滞位的文件或者目录
find / -readable                            # 查找可读权限的文件或者目录
find / writable                                # 查找可写权限的文件或者目录

 

基于文件名称查找

find / -mount -name "file"                    # 查找根目录分区下面名叫'file'的文件或者目录
find / -mount -iname "file"                    # 查找根目录分区下面名叫'file'的文件或者目录,不区分大小写
find / -mount -path  "*net*"                # 查找根目录分区路劲中包含net的所有文件或者目录
find / -mount -ipath  "*net*"                # 查找根目录分区路劲中包含net的所有文件或者目录,不区分大小写

 

基于链接数查找

find / -mount -links 3                        # 查找根目录分区下面链接文件数大于等于3的文件或者目录

 

基于inode值查找

find / -inum 101207402                        # 查找根目录下面inum是101207402值的文件或者目录

 

对文件进行操作

find /tmp -type f -exec rm -rf {} \;        # 对tmp下面的普通文件执行删除操作;调用系统的rm命令
find /tmp -type -delete                        # 对tmp下面的普通文件执行删除操作;

 

对匹配文件进行格式化输出

find /etc -type f -printf 'file:\t %t+ %p\n'   # 下次再研究了,printf很有用的一个参数

 

基于文件类型查找

find / -type f                                # 查找根目录下面的所有文件
b        块文件,如:磁盘文件
c        字符文件,如:驱动文件
d        目录文件
p        管道文件
f        普通文件
l        链接文件
s        套接文件
d        这个我也不知道是啥文件

 

查找3天内,被被更改过的文件;

find / -mount -ctime -3 -printf '%t %p\n'  
%t表示ctime时间打印,%p代表匹配的内容,printf默认不支持换行,所以需要\n

 

转义符

\a   警钟
\b   退格键 
\c   立即停止此格式的打印并刷新输出。 
\f   换页 
\n   换行 
\r   回车 
\t   制表符 
\v   垂直制表符 
\0   不知道干啥的。。。 
\\   转义反斜杠 
\nnn   不知道干啥的。。。 
%%   打印一个百分比 
%ak   文件最后一次访问时间的格式由k指定,k可以是如下内容:
  @ 计算从1970年1月1日零时到此时此刻一共经历的秒数
  h 以24小时制返回最后访问时间的小时时刻 
  i 以12小时制返回最后访问时间的小时时刻 
  k 等同于h 
  l 等同于i 
  m 以60分钟制返回最后访问时间的分钟时刻 
  p 返回最后访问时间是上午还是下午 
  r 以12小时制返回周后访问时间的具体时刻,并且返回上午或者下午 
  s 返回最后访问时间的具体秒 
  t 以24小时制返回周后访问时间的具体时刻
  + 返回最后访问时间的日期和时间,日期和时间用+号分隔
  x 以12小时制返回最后访问的具体时刻 
  z 返回最后访问时间的时区 
  a 返回最后访问时间是星期几,仅打印周期前三个字母 
  a 返回最后访问时间是星期几,打印完整周期
  b 返回最后访问时间是哪个月份,仅打印前三个字母 
  b 返回最后访问时间是哪个月份,打印完整月份
  c 返回最后访问时间的具体时刻,格式:sat nov 04 12:02:33 est 1989 
  d 返回最后访问时间的数字月份
  d 返回最后访问时间的年月日,格式:mm/dd/yy
  h 等效于b
  j 返回最后访问时间的具体日子,格式:001..366
  m 返回最后访问时间的具体月份,格式:01..12
  u 返回最后访问时间的具体周期,格式:00..53(linux默认一年最多53周)
  w 周的天
  w 等效于u
  x 等效于d
  y 返回最后访问时间的年份,仅返回最后两个数字
  y 返回最后访问时间的年份,返回具体年份
     
%b   此文件在512字节块中使用的磁盘空间量。
%c   返回最后状态更改时间
%ck   返回最后状态更改时间,k的值参考%ak
%d   文件在目录树中的深度;
%d   文件存在的设备号,以十进制表示
%f   删除所有主要目录的文件名
%f   文件所在文件系统的类型;
%g   文件的组名,如果组没有名称,则为数字组id
%g   文件的数字组id
%h   文件名的主要目录(除了最后一个元素)。如果文件名不包含斜%h说明符展开为"."。
%h   在其中找到文件的命令行参数。
%i   文件的inode编号
%k   此文件在1k块中使用的磁盘空间量。
%l   符号链接的对象
%m   文件的权限位,以数字形式展示
%m   文件的权限位,以字母形式展示
%n   到文件的硬链接的数量
%p   匹配到文件的路劲及名称
%p   仅匹配文件的名称,不包含路劲
%s   文件的大小,字节为单位
%s   文件的稀疏
%t   文件最后一次修改时间
%tk   文件最后一次修改时间,k的值参考%ak
%u   文件的用户名,如果用户没有名称,则为数字用户id。
%u   文件的用户名id
%y   文件的类型
%y   基本等同于%y
%z   文件的安全上下文

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

基本参数

-p 默认参数,不允许跟符号链接文件 
-l

默认参数,当查找到软链接文件时,默认指向源文件属性;当-l生效时,

-type参数指向的类型是源文件

-h 默认参数,不允许跟硬链接文件 
-d

调试参数,打印诊断信息,这有助于诊断为什么find没有做您想做的事情的问题。

调试选项的列表应该用逗号分隔。 

-olevel

启用查询优化。一共有从0-3四个优化级别。其中0和1级别是等价的,系统默认值为1,

这个选项需要在o后面直接跟一个表示查询优化的十进制数字,如o2。

-d 深度的同义词,与freebsd、netbsd、macos x和openbsd兼容。使用较少
-daystart

从今天开始测量时间(-amin, -atime, -cmin, -ctime, -mmin, -mtime),

而不是从24小时之前。此选项只影响稍后出现在命令行中的测试。使用较少

-depth 查找文件时,首先查找当前目录中的文件,然后再其他子目录中查找
-follow 如果find命令遇到符号链接⽂文件,就跟踪⾄至链接所指向的⽂文件。
-help 帮助 
-ignore_readdir_race 屏蔽错误消息,默认会打印find输出错误的信息,百度大半天也没看到有人用
-maxdepth 设定目录查找最大层级,可以和-mindepth结合使用
-mindepth 设定目录查找最小层级,可以和-maxdepth使用
-mount

不要在其他文件系统上下行目录。 -xdev的另一个名称,用于与find的其他一些版本兼容。

可以用来屏蔽proc分区

-noignore_readdir_race 关闭-ignore_readdir_race的效果,基本没见过
-noleaf 不要假设目录包含的子目录比它们的硬链接数少2个,从而进行优化。基本没见过
-regex

更改稍后在命令行中进行的-regex和-iregex测试所理解的正则表达式语法。

find默认只支持通配符,不支持基础正则表达式

-version 查看find版本 
-warn, -nowarn

打开或关闭警告消息。这些警告仅适用于命令行使用,而不适用于find在搜索目录时可能

遇到的任何条件。如果标准输入是tty,则默认行为对应-warn,否则对应-nowarn。

-xautofs 不要在autofs文件系统上下降目录,基本没见过
-xdev 等效于-mount
+n 大于n
-n 小于n
n 等于n
-amin n 最后一次访问时间是多少分钟
-anewer file

最后一次访问文件的时间比修改文件的时间更近。

-atime n

上次访问文件是在24小时前。 当find计算出文件最后一次被访问的24小时前的时间段时,

将忽略任何小数部分,因此要匹配-atime +1,文件必须至少在两天前被访问。

-cmin n 文件的状态上次更改是在n分钟前。
-cnewer file

最后一次更改文件状态的时间比修改文件的时间更近。

-ctime n

文件的状态上次更改是在24小时前。

-empty 文件是空的,它可以是常规文件,也可以是目录。
-executable 匹配可执行文件和可搜索目录(在文件名解析意义上)。
-false 总是错误的
-fstype type 指定查找文件系统下的内容
-gid gid查找
-group 用户组查找
-ilname 不区分大小写查找链接文件 
-iname 不区分大小写查找文件
-inum 根据inode查找文件 
-ipath 路劲查找,路劲名称不区分大小写 
-iregex 类似-regex,但匹配不区分大小写。
-links 根据链接文件数查找 
-lname 文件是一个符号链接,其内容与shell模式模式匹配。
-mmin 文件的数据上次修改是在n分钟前。
-mtime 文件数据上次修改是在n*24小时前。
-name 文件名查找文件
-newer

文件被修改的时间比文件晚。如果file是一个符号链接,并且-h选项或-l选项生效,

则始终使用它所指向的文件的修改时间。

-nogroup 非指定用户组的文件
-nouser 非指定用户的文件
-perm 根据文件权限进行查找
-readable 匹配可读文件
-size  根据文件大小匹配
-type 根据文件类型进行查找
-uid 根据用户id进行查找
-user 根据用户名进行查找
-used 文件上次访问是在其状态上次更改后的n天
-writable 匹配可写的文件
-delete 对匹配的文件执行删除操作;
-exec

find通过exec参数调用exec后面的命令对匹配文件进行操作;

用{} 来代表匹配的内容,以\;表示结束

-execdir

类似于-exec,但是指定的命令是从包含匹配文件的子目录中运行的,

这通常不是您开始查找的目录。

-fprint 将完整的文件名打印到文件文件中。
-ok

交互式操作;比如-exec,但先问问用户。如果用户同意,运行该命令。否则返回false。

如果运行该命令,它的标准输入将从/dev/null.重定向

-okdir

就像-execdir,但首先询问用户的方式和-ok一样。如果用户不同意,则返回false。

如果运行该命令,它的标准输入将从/dev/null.重定向

-print 在标准输出上打印完整的文件名,然后换行。
-printf 格式化打印;

 

 以上部分均来自于find在线帮助文档,本人仅进行了翻译、收集、整理工作;有不对的地方请多多指点,另外建议各位同学不要跟我这种神经病一样,花一天的时间翻译一个man手册~~~

 注意要点

  • find支持'!'取反符号
  • find默认支持通配符,不支持基础正则
  • find尽量用printf进行格式输出,不要用ls打印