比起locate来,find用起来要复杂一些,但功能也强大得多。
在指定目录中查找文件
find [option] [path] [rule] [action]
-P 依据物理目录(Physical)查找 -L 依据符号链接目录(逻辑目录,Logical)查找
find命令的参数包括要查找的路径(默认是当前目录)、查找规则和找到后的操作三部分:
如在当前目录下查找名字为fruit的文件或目录:
[peter@ibi98 ~]$ find . -name fruit
./prac/fruit
查找规则包括:
-name filename #查找名为filename的文件 -perm #按执行权限来查找 -user username #按文件属主来查找 -group groupname #按组来查找 -mtime -n +n #按文件更改时间来查找文件,-n指n天以内,+n指n天以前 -atime -n +n #按文件访问时间来查找文件,-n指n天以内,+n指n天以前 -ctime -n +n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前 -nogroup #查无有效属组的文件,即文件的属组在/etc/groups中不存在 -nouser #查无有效属主的文件,即文件的属主在/etc/passwd中不存在 -newer f1 !f2 #找文件,-n指n天以内,+n指n天以前 -ctime -n +n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前 -nogroup #查无有效属组的文件,即文件的属组在/etc/groups中不存在 -nouser #查无有效属主的文件,即文件的属主在/etc/passwd中不存在 -newer f1 !f2 #查更改时间比f1新但比f2旧的文件 -type b/d/c/p/l/f #查是块设备、目录、字符设备、管道、符号链接、普通文件 -depth #使查找在进入子目录前先行查找完本目录 -fstype #查更改时间比f1新但比f2旧的文件 -type b/d/c/p/l/f #查是块设备、目录、字符设备、管道、符号链接、普通文件 -size [+-]n[cwbkMG] #查长度为[大于|小于]n块[或n字节(c)、字(w,2字节)、块(b)、 kB、MB、GB]的文件 -depth #使查找在进入子目录前先行查找完本目录 -mount #查文件时不跨越文件系统挂载点 -fstype #查位于某一类型文件系统中的文件,这些文件系统类型通常可在 /etc/fstab中找到
找到后的操作包括:
-delete #删除文件 -exec command ; #执行命令command -exec command {} + #执行命令command,并把找到的文件名字作为命令command的参数 -execdir command ; -execdir command {} + -fls file #类似-ls,输出到文件file -fprint file #类似printf,输出到文件file -fprint0 file #类似printf0,输出到文件file -fprintf file format #类似printf format,输出到文件file -ls #在标准输出上以ls -dils方式列出结果 -ok command ; #类似-exec command ;,执行之前先询问用户 -okdir command ; #类似-execdir command ;,执行之前先询问用户 -print #在标准输出上列出文件名,结尾换行 -print0 #在标准输出上列出文件名,结尾不换行 -printf format #在标准输出上按格式输出 -prune #忽略某个目录 -quit #直接退出
下面给出几个应用的例子。
查找目录并列出目录下的文件(为找到的每一个目录单独执行ls命令,没有选项-print时文件列表前一行不会显示目录名称):
$ find ./ -type d -print -exec ls {} \;
查找目录并列出目录下的文件(为找到的每一个目录单独执行ls命令,执行命令前需要确认):
$ find ./ -type d -ok ls {} \;
在当前目录中查找名为test的文件,找到后打印其内容:
$ find ./ -name test -print -exec cat {} \;
查找空文件并删除:
$ find ./ -empty -type f -print -delete
find功能强大,不但可以按照不同的规则查找文件,还可以再找到后执行指定的操作。