find命令用来根据一定条件查找文件夹或文件,并且可以直接执行一些命令。

语法

1
2
3
4
5
# find的完整语法结果如下
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [expression]

# 由于很多参数在实际使用中极少用到,因此为了方便记忆,这里简化成
find [路径] [选项] [参数] [动作]

被简化的极少用到的参数

[-H] [-L] [-P] 主要控制碰到符号链接时采取的行为
-P:也就是默认行为, 从来不follow symbolic links.

-L: 总是follow symbolic links.

-H: 仅仅当作为命令行参数时,也就是这里的[path…],才会follow symbolic links.

[-Olevel]:指定优化等级,在不影响测试结果的前提下,通过reorder测试test,加快测试速度, 0优化等级最低,这是默认行为,3优化等级最高,耗时最少的放在最前面,耗时最多的放在最后面。
[-D help|tree|search|stat|rates|opt|exec]:打印诊断信息,当查找的结果跟预想的不一致时,可以使用该调试选项。

路径

路径即需要查找的位置,默认为当前位置,不过还是建议把.加上

选项

选项里的内容其实也很少用到,这里只做下介绍
-depth从指定目录下最深层的子目录开始查找
-maxdepth levels 查找的最大目录级数,levels为自然数※
-regextype type 改变正则表达式的模式。默认为emacs,还有posix-awk、possix-basic、posix-egrep、posix-extended

参数

这部分是实际使用中使用最多的部分了

参数 说明
-mtime [-n|n|+n] 按照文件的修改时间来查找
-n 表示文件更改时间距今n天以内
+n表示文件更改时间再n天以上
n表示距现在n天
-atime [-n|n|+n] 按照文件访问时间来查找
-ctime [-n|n|+n] 安装文件状态修改时间来查找
-iname 按文件名查找,忽略大小写
-name 按文件名来查找,支持* ? []等特殊通配符
–size n[cwbkMG] 查找文件长度为n块的文件,带有cwbkMG时标示文件长度以字节计,大小前加上+ -表示比该大小更大或更小的文件
-type 按文件类型查找b 块设备文件
c 字符设备文件
d 目录
p 管道文件
l 符号链接文件
f 普通文件
s socket文件
d 目录
-regex 接正则表达式
-path pattern 指定路径样式,配合-prune参数排除指定目录
-group 按照文件所属的组来查找
-user 按文件属主查找
-perm 按文件权限查找

动作

动作 说明
-delete 删除查找出来的文件
-exec 执行该参数跟的命令
-ok 和exec作用相同,但是会让用户先确认
-prune 使用这一选项可以使find命令不在当前指定目录查找
-print 打印查找出来的文件,默认功能,使用中可以忽略

逻辑运算

find支持逻辑运算符

运算符 说明
! -not 取反
-a 取交集相当于and
-o 取并集相当于or

示例

按大小查找

1
2
3
4
# 查找当前目录大小为28k文件
find . -size 28k
# 查找当前目录大小大于28k文件
find . size +28k

按文件名查找

1
2
3
4
5
6
7
# 查找当前目录名为abcde文件
find . -name abcde
# 通配符查找注意
# 错误 find . -name *abc*
find . -name '*ab*'
# 查找abc目录
find . -name abc -type d

按文件权限查找

1
find . -perm 644

按用户查找

1
find . -user root

逻辑运算

1
2
3
4
#在当前目录下搜索文件要么是cangls的文件,要么是bols的文件,两个都可以搜索到。 
[root@localhost ~ ] # find . -name cangls -o -name bols
./cang1s
./bols

exec

1
2
3
# 这里{}代表之前查找的结果,用;表示结束,考虑不同的系统可能;含义不同,所以加上转义符
find . -type f -mtime +14 -exec ls -lh {} \;
find . -type f -mtime +14 -exec rm {} \;

xargs

find和xargs结合使用也非常常见

1
2
3
4
5
6
[root@master193 hy]# find . -name '*ab*' |xargs ls -lh
-rw-r--r-- 1 root root 0 Nov 5 21:05 ./1abcde
-rw-r--r-- 1 root root 0 Nov 5 21:05 ./abcde
-rw-r--r-- 1 root root 0 Nov 5 21:05 ./abcde2
# 批量移动-i 参数是的{}代表前面find查找结果
find . -name '*ab*' |xargs -i mv {} test/

exec 和 xargs区别

  • exec 该参数是将查找的结果文件名逐个传递给后面的命令执行,如果文件比较多则执行的效率会较低 xargs是将查找的结果一次性传给后面的命令执行,命令执行效率高,可以使用-n参数控制一次传递文件的个数
  • exec文件名有空格等特殊字符也照常处理 xargs处理特殊的文件名(例如:文件名有空格需要采用特殊的方式(find.-name”edu“-print0|xargs -0 ls -lh )

参考

Linux 在线手册页 - man.cx 手册页