linux find 用法

find命令用来查找文件(在当前目录以及当前目录的子目录下查找),该命令能够基于正则表达式、目录树深度、文件日期、文件类型等条件查找文件。

一、根据文件名或正则表达式搜索文件

  • 根据名称搜索
    用法1: find path -name 'filename'
    用法2: find path -iname 'filename'
    两种用法都支持通配符,其中,用法1区分大小写, 用法2不区分大小写。实例:查找当前目录下以.sh结尾的文件,命令如下:
 find . -name '*.sh'
  • 使用逻辑操作符,按多个条件搜索。-a 和 -and 为逻辑与, -o 和 -or 为逻辑或。
    实例:找出当前目录下以.sh结尾并且文件名中含有test的文件,命令如下:
 find . -name '*.sh' -a -name '*test*'
  • 使用正则表达式

-regex 选项可以根据正则匹配文件,也可使用-iregex不区分大小写。 实例:查找当前目录下以.sh或.sample结尾的文件,命令如下:

find . -regex '.*\.\(sh\|sample\)$'

拓展:如何查找文件名不包含某个字符的文件
例:查找文件名中不包含test且以.sh结尾的文件,命令如下:
find . -name '.sh' -a ! -name 'test'
例:查找除了.git目录以外,以.sh结尾的文件
find . -name '.git' -prune -o -name '
.sh'

二、根据路径搜索

-path可以限制匹配文件的路径以及名称。
实例:查找test目录下,以.sh结尾的文件

 find . -name '*.sh' -path '*/test/*'

三、根据目录深度搜索

-maxdepth 和 -mindepth选项可以限制find命令遍历的目录深度。
实例:只在当前目录下查找.sh结尾的文件,命令如下:

 find . -maxdepth 1  -name '*.sh'

四、根据文件类型搜索

类UNIX系统中,文件类型包括普通文件、目录、字符设备、符号链接、套接字等。find命令通过-type属性对文件类型进行过滤。
例:查找当前目录下所有的目录,包括下一级子目录,命令如下,

 find . -maxdepth 2  -type d

-type选项支持的参数对应的文件类型如下:

文件类型 参数值
普通文件 f
符号链接 l
目录 d
字符设备 c
块设备 b
套接字 s
FIFO p

五、根据文件的时间戳搜索

类unix系统中每个文件都有三种时间戳

  • 访问时间(-atime、-amin):用户最近一次访问文件的时间。
  • 修改时间(-mtime、-mmin):文件最后一次被修改的时间。
  • 元数据更改时间(-ctime、-cmin) :文件权限、所有权等最后一次被修改的时间。

time结尾的选项,其单位为天,min结尾的选项其单位为分钟,这些选项的值都为一个正负整数, 如+7,表示,7天以前被访问过的文件,-7表示7天以内被访问过的文件,7表示恰好7天前被访问的文件。

例:
1、七分钟以内被修改的文件

find .  -mtime -7

2、七天以前被访问过的文件

find . -atime +7

拓展: -newer选项可以比较修改时间
例:找出比test.sh文件的修改时间更近的文件

 find . -type f -newer test.sh

六、根据文件大小搜索

# 大于2k的文件
 find -type f -size +2k

# 小于2k的文件
 find -type f -size -2k
# 等于2k的文件
 find -type f -size 2k

支持的单位,除了k之外,还有如下几个

  • b:块(512字节)
  • c:字节
  • w: 字(2个字节)
  • k:千字节(1024个字节)
  • M :兆字节(1024k)
  • G:吉字节(1024M)

七、基于文件权限和所有权搜索

# 打印权限为644的文件
find -type f -perm 644
# 打印用户www拥有的文件
find -type f -user www

八、利用find搜索结果执行相应的命令

  • 删除操作
    -delete选项可以直接删除搜索到的文件
find . -name '*test2*' -delete
  • 调用其他命令
    -exec选项可以调用其他命令,对搜索结果执行相应的操作
将所有以.sh结尾的文件都合并到all_shell.txt文件中
find . -type f -name '*.sh' -exec cat {} >all_shell.txt \;

命令中的{},find会将它替换为搜索到的文件名。命令结尾的;,是cat命令的结束符,而不是find命令的结束符,所以需要转义。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。