find命令
Linux find命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
Linux下find命令在目录结构中搜索文件,并执行指定的操作。Linux下find命令提供了相当多的查找条件,功能很强大。
即使系统中含有网络文件系统( NFS),find命令在该文件系统中同样有效,只你具有相应的权限。 在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间
语法
find path -option [ -print ] [ -exec -ok command ] {} \;
选项
- -name name, -iname name : 文件名称符合 name 的文件。iname 会忽略大小写
- -user username 按文件属主来查找
- -perm 按执行权限来查找
- -group groupname 按组来查找
- -mtime -n +n 按文件更改时间来查找文件,-n指n天以内,+n指n天以前
- -atime -n +n 按文件访问时间来查
- -ctime -n +n 按文件创建时间来查找文件,-n指n天以内,+n指n天以前
- -nogroup 查无有效属组的文件,即文件的属组在/etc/groups中不存在
- -nouser 查无有效属主的文件,即文件的属主在/etc/passwd中不存
- -type b/d/c/p/l/f 查是块设备、目录、字符设备、管道、符号链接、普通文件
- -depth 先查找子目录,再查找父目录
- -maxdepth n 规定查找的最大目录深度,当前目录的深度就是1
- -path 后面跟路径,指定文件或文件夹的路径
- 比如"./dir/*"表示当前目录下的dir目录下的所有文件
- 但是"./dir"仅仅表示dir这一个目录
- 一般用来排除文件夹,!-path
在find中使用通配符时,要用双引号,如"name *"
- 查找文件,并直接删除
$ find . -name runme -exec rm {} \;
$ find . -name runme -execdir rm {} \;
- 查找文件,删除前询问是否删除
$ find . -name runme -ok rm {} \;
$ find . -name runme -okdir rm {} \;
实例
- 查找当前目录及子目录下所有扩展名为log的文件
[root@hzj home]# find . -iname "*.log"
./3.log
./1.log
./dir/2.log
./11.log
./6.log
./4.log
./2.log
./visit.log
./b.log
./a.log
- 查找当前目录及子目录下所有的一般文件
[root@hzj home]# find . -type f
./3.log
./1.log
./dir/2.log
./11.log
./6.log
./4.log
./2.log
./visit.log
./b.log
./a.log
- 查找当前目录及子目录下所有的目录
[root@hzj home]# find . -type d
.
./dir
./dir/dir
- 查找当前目录及子目录下所有20内创建过的文件
[root@hzj home]# find . -type f -ctime -20
./3.log
./1.log
./dir/2.log
./11.log
./6.log
./4.log
./2.log
./visit.log
./b.log
./a.log
- 查找当前目录及子目录20天前更新过的文件,每页5条
[root@hzj home]# find /var/log -type f -mtime +20 | more -5
/var/log/boot.log-20190821
/var/log/tallylog
/var/log/yum.log
/var/log/ecs_network_optimization.log
/var/log/grubby
--More--
- 遍历当前目录下所有文件(夹),如果文件(夹)的名字是以.log结尾的,就打印文件(夹)的名字。
[root@hzj home]# find -name '*.log' -print
./3.log
./1.log
./dir/2.log
./11.log
./6.log
./4.log
./2.log
./visit.log
./b.log
./a.log
- 遍历当前目录下所有文件(夹),如果文件(夹)的名字不是以.log结尾的,就打印文件(夹)的名字。
[root@hzj home]# find -name '*.log' -o -print
.
./dir
./dir/dir
./test
./test/.bash_profile
./test/.bash_logout
./test/.bashrc
- 列出除了dir目录下的所有文件
find -path "./dir/*" -o -print
或
find ! -path "./dir/*" -print
- 排除多条路径
find ! -path "./dir1/*" ! -path "./dir2/*" -print
- 查找目录并列出目录下的文件(将找到的目录添加到ls命令后一次执行,参数过长时会分多次执行)
find ./ -type d -exec ls {} +
- 打印test文件名后,打印test文件的内容
find ./ -name test -print -exec cat {} \;
- 不打印test文件名,只打印test文件的内容
find ./ -name test -exec cat {} \;
- 查找文件更新日时在距现在时刻二天以内的文件
find ./ -mtime -2
- 查找文件更新日时在距现在时刻二天以上的文件
find ./ -mtime +2
- 查找文件更新日时在距现在时刻一天以上二天以内的文件
find ./ -mtime 2
- 查找文件更新日时在距现在时刻二分以内的文件
find ./ -mmin -2
- 查找文件更新日时在距现在时刻二分以上的文件
find ./ -mmin +2
- 查找文件更新日时在距现在时刻一分以上二分以内的文件
find ./ -mmin 2
- 查找文件更新时间比文件abc的内容更新时间新的文件
find ./ -newer abc
- 查找文件访问时间比文件abc的内容更新时间新的文件
find ./ -anewer abc
- 查找空文件或空目录
find ./ -empty
- 查找空文件并删除
find ./ -empty -type f -print -delete
- 查找权限为644的文件或目录(需完全符合)
find ./ -perm 664
- 查找用户/组权限为读写,其他用户权限为读(其他权限不限)的文件或目录
find ./ -perm -664
- 查找所有者权限有读权限的目录或文件
find ./ -perm -u=r
- 查找用户组权限有读权限的目录或文件
find ./ -perm -g=r
- 查找其它用户权限有读权限的目录或文件
find ./ -perm -o=r
- 查找所有者为lzj的文件或目录
find ./ -user lzj
- 查找组名为gname的文件或目录
find ./ -group gname
- 查找文件的用户ID不存在的文件
find ./ -nouser
- 查找文件的组ID不存在的文件
find ./ -nogroup
- 查找有执行权限但没有可读权限的文件
find ./ -executable \! -readable
- 查找文件size小于10个字节的文件或目录
find ./ -size -10c
- 查找文件size等于10个字节的文件或目录
find ./ -size 10c
- 查找文件size大于10个字节的文件或目录
find ./ -size +10c
- 查找文件size小于10k的文件或目录
find ./ -size -10k
- 查找文件size小于10M的文件或目录
find ./ -size -10M
- 查找文件size小于10G的文件或目录
find ./ -size -10G
使用正则表达式
-regex 'regex'
:用正则表达式来匹配。正则表达式匹配的是文件的相对路径,而不是文件名。
-iregex
是忽略大小写的正则表达式
find -type f -regex'.*\.mk$'
:查找当前目录及所有深度的子目录中的mk文件。
xargs -d
:设置分隔符,默认空格和换行都是分隔符。