find <PATH> [-option] [action] 直接搜寻硬盘实时.递归.根据i节点信息查找文件时间花费很大!
whereis与locate是利用数据库来搜寻数据而没有搜寻实际的硬盘文件,所以相当的快速,比较省时间!
所以通常使用whereis或者locate来检查,如果真的找不到了,才以find来搜寻。
一.与时间有关的参数(-atime,-ctime,-mtime)
find / -mtime 0 0天=24小时内 | find / -mtime 4 3*24~4*24小时内 |
find . –newer age.awk ! –newer belts.awk –exec ls –l {} \; |
二.与使用者或群组有关的参数
#find /home –user zcs //找出属于某个用户的文件 |
#find / -nouser //找出不属于系统任何人的档案 |
三.与文件名有关的参数
# find / -name t*.doc | # find |grep abc |
# find -name tes?[1-5].doc | # find -name “test.doc” |
四.与文件类型有关的参数(find /home –type f找普通文件)
$ find /etc -type d -print | $ find . ! -type d -print |
$ find /etc -type l -print | $ find /dev -type s -print|xargs file |
在使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec执行。不幸的是,有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。Find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。
在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。
下面的例子查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件:
$find /dev -type s -print|xargs file
五.与文件大小有关的参数
-size +1000k大于1M | -size +8(默认M) | -size +1000c | –size 0b |
六.与档案权限有关的参数
#find / -perm – 220 find / –perm –g+w,u+w |
#find / -perm /222 u有w or g有w or o有w #find / -perm /u+w,g+w u有w or g有w #find / -perm /u=w,g=w u有w or g有w |
#find / –perm -444 –perm /222 ! –perm /111 #find / –perm –a+r –perm /a+w ! –perm /a+x |
七.额外可进行的动作
find path name-options [-print-exec -ok]
-ok和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
#find / -exec grep "Hello" {} \; 查询所有保含字符串“Hello”的文件 |
#find / -name "*.tmp" -exec rm -f {} \; 删除所有临时文件 |
#find / -ctime +20 -exec rm -f {} \; 删除+20天以前的文件 |
#find /etc -type f -links +1 -exec cp {} /links \; |
八.使用depth选项
在使用find命令时,可能希望先匹配所有的文件,再在子目录中查找。使用depth选项就可以使find命令这样做。这样做的一个原因就是,当在使用find命令向磁带上备份文件系统时,希望首先备份所有的文件,其次再备份子目录中的文件。
在下例中,find从文件系统的根目录开始,查找CON.FILE的文件。它将首先匹配所有的文件然后再进入子目录中查找。
$find / -name"ZCS.FILE"-depth-print
九.-patch -prune忽略某个目录
如果在查找文件时希望忽略某个目录,因为你知道那个目录中没有你所要查找的文件,那么可以使用-prune选项来指出需要忽略的目录。在使用-prune选项时要当心,因为如果你同时使用了-depth选项,那么-prune选项就会被find命令忽略。
如果希望在/apps目录下查找文件,但不希望在/apps/bin目录下查找,可以用:
比如要在/usr/sam目录下查找不在dir1子目录之内的所有文件 find /usr/sam -path "/usr/sam/dir1" -prune -o -print find [-path ..] [expression] 在路径列表的后面的是表达式 -path "/usr/sam" -prune -o -print 是-path "/usr/sam" -a -prune –o -print简写 表达式按序求值, -a 和 -o 都是短路求值,与 && 和 || 类似 这个表达式组合特例可以用伪码写为 if -path "/usr/sam" then -prune else |
避开多个文件夹 find /usr/sam \( -path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -print 圆括号表示表达式的结合。 \ 表示引用,即指示 shell 不对后面的字符作特殊解释,而留给 find去解释其意义。 |
查找某一确定文件,-name等选项加在-o 之后 #find /usr/sam \(-path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -name "temp" -print |
十.除find外的其它常文件查找名称
1.locate passwd 在updatedb库中的文件名
/etc/updatedb.conf
数据库的建立是在每天执行一次(Redhat默认),所以当新建立起来档案,却还在数据更新之前搜寻档案,那么locate会报告找不到,此时可以手动执行updatedb命令来更新数据库。
2.whereis useradd 在库中找文件
3.which passwd在$PATH中找命令
4.grep -ir root /etc 根据内容查找
5.ls -R|grep passwd 根据文件名称
6.type -p grep