Linux的五个查找命令:find,locate,whereis,which,type 及其区别

大概区别:
find          实际搜寻硬盘查询文件名称
locate       配合数据库查看文件位置 
whereis    查看文件的位置
which       查看可执行文件的位置 
建议使用:
当我们用whereis和locate无法查找到我们需要的文件时,可以使用find,但是find是在硬盘上遍历查 找,因此非常消耗硬盘的资源,而且效率也非常低,因此建议大家优先使用whereis和locate。 
locate 是在数据库里查找,数据库大至每天更新一次。 
whereis 可以找到可执行命令和man page 
find 就是根据条件查找文件。 
which 可以找到可执行文件和别名(alias)

1. find

find的使用格式如下:
find +目录 +条件 +条件值

指搜索层级
	-maxdepth level 最大搜索目录深度,指定目录为1级
	-mindepth level 最小搜索目录深度
先处理目录内的文件,再处理目录
-depth
根据文件名和inode查找
-name “文件名称”:支持使用glob *,?,[],[^]
-name  "文件名称":不区分字母大小写
-inum n 按inode 号查找
-samefile name 相同的inode号的文件
links n 链接数为n的文件

与时间有关的参数:

-mtime n : n为数字,意思为在n天之前的“一天内”被更改过的文件;
-mtime +n : 列出在n天之前(不含n天本身)被更改过的文件名;
-mtime -n : 列出在n天之内(含n天本身)被更改过的文件名;
-newer file : 列出比file还要新的文件名
例子
find /root -mtime 0 # 在当前目录下查找今天之内有改动的文件

与用户或用户组名有关的参数:

-user name : 列出文件所有者为name的文件
-group name : 列出文件所属用户组为name的文件
-uid n : 列出文件所有者为用户ID为n的文件
-gid n : 列出文件所属用户组为用户组ID为n的文件
例子
find /home/hadoop -user hadoop # 在目录/home/hadoop中找出所有者为hadoop的文件

find的使用实例:

find / -name passwd   # 查找文件名为passwd的文件
find /www/wwwroot/wdcp.cloudduo.cn -name www
find / -iname passwd   # 查找文件名为passwd的文件(不区分大小写)
find / -iname *file*      # 通配符查找文件名包含file的文件
find . -perm 0755     # 查找当前目录中文件权限的0755的文件
find . -size +12M     # 查找当前目录中大于12M的文件,注意c表示byte
 find . -name "my*"  #搜索当前目录(含子目录,以下同)中,所有文件名以my开头的文件。
find . -name "my*" -ls  #搜索当前目录中,所有文件名以my开头的文件,并显示它们的详细信息。
find . -type f -mmin -10  #搜索当前目录中,所有过去10分钟中更新过的普通文件。如果不加-type f参数,则搜索普通文件+特殊文件+目录。

实例

1、查找/www/wwwroot 目录下面所有 index.html 的文件

[root@dapao ~]# find /www/wwwroot/ -name index.html
/www/wwwroot/192.168.1.121/index.html
/www/wwwroot/192.168.1.121:8000/index.html

2、查找/www/wwwlogs目录下面7日前创建的文件,并删除

[root@dapao ~]# find /www/wwwlogs/ -type f -mtime +7 -ok rm {} \;
< rm ... /www/wwwlogs/nginx_error.log > ?
< rm ... /www/wwwlogs/access.log > ?

3、查找/www/backup 目录下面大于1M的文件

[root@dapao backup]# find /www/backup/ -type f -size +1M -ok rm {} \;
< rm ... /www/backup/jdk-8u212-windows-x64.exe > ?
< rm ... /www/backup/Micro8-master.zip > ?
< rm ... /www/backup/aaa.rar > ?

find用的最多的就是可以查看到服务器中哪些文件占用磁盘空间,以此来删除多余无用的文件。如果不确定,请不要执行删除动作
4、查找/www/wwwlogs 目录下么7天前创建的文件,并删除

find /www/wwwlogs/ -type f -mtime +7 -ok rm {} \;

5、查找/www/backup 目录下面大于 100m的文件,并删除

find /www/backup/ -type f -size +100M -ok rm {} \;

6、查找 / 目录下面的空文件,并列出

find / -type f -size 0 -exec ls -l {} \;

请勿轻易执行删除动作,阅读本文需要有一定的Linux基础知识,如果删除到核心文件,与本文无关。

2. locate

locate [OPTION]... PATTERN...
选项和参数:
-i:忽略大小写;
-c:不输出文件名,仅计算找到的文件数量;
-l:仅输出几行的意思,例如输出5行则是-l 5;
-S:输出locate所使用的数据库文件的相关信息,包括该数据库记录的文件/目录数量等;
-r:后面可接正则表达式的显示方式

locate命令其实是“find -name”的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。

updatedb

locate命令的使用实例:
$ locate /etc/sh
搜索etc目录下所有以sh开头的文件。
$ locate ~/m
搜索用户主目录下,所有以m开头的文件。
$ locate -i ~/m
搜索用户主目录下,所有以m开头的文件,并且忽略大小写。
语法:
[root@redhat ~]# locate 文件或者目录名称

实例:

[root@redhat ~]# locate passwd 
/home/weblogic/bea/user_projects/domains/zhanggongzhe112/myserver/stage/_appsdir_DB_war/DB.war/jsp/as/user/passwd.jsp
/home/weblogic/bea/user_projects/domains/zhanggongzhe112/myserver/stage/_appsdir_admin_war/admin.war/jsp/platform/passwd.jsp
/lib/security/pam_unix_passwd.so 
/lib/security/pam_passwdqc.so 
/usr/include/rpcsvc/yppasswd.x 
/usr/include/rpcsvc/yppasswd.h 
/usr/lib/perl5/5.8.5/i386-linux-thread-multi/rpcsvc/yppasswd.ph 
/usr/lib/kde3/kded_kpasswdserver.la 
/usr/lib/kde3/kded_kpasswdserver.so 
/usr/lib/ruby/1.8/webrick/httpauth/htpasswd.rb 
/usr/bin/vncpasswd 
/usr/bin/userpasswd 
/usr/bin/yppasswd 

3. whereis

参数说明: 
-b : 只找二进制文件 
-m: 只找在说明文件manual路径下的文件 
-s : 只找source源文件 
-u : 没有说明文档的文件
如果省略参数,则返回所有信息。
whereis命令的使用实例:
$ whereis grep

实例:

[root@redhat ~]# whereis passwd 
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz 
将和passwd文件相关的文件都查找出来 

[root@redhat ~]# whereis -b passwd 
passwd: /usr/bin/passwd /etc/passwd 
只将二进制文件 查找出来 

和find相比,whereis查找的速度非常快,这是因为linux系统会将 系统内的所有文件都记录在一个数据库文件中,当使用whereis和下面即将介绍的locate时,会从数据库中查找数据,而不是像find命令那样,通 过遍历硬盘来查找,效率自然会很高。
但是该数据库文件并不是实时更新,默认情况下时一星期更新一次,因此,我们在用whereis和locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。

4. which

which命令的作用是,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。
which命令的使用实例:
$ which grep

5. type

type命令其实不能算查找命令,它是用来区分某个命令到底是由shell自带的,还是由shell外部的独立二进制文件提供的。如果一个命令是外部命令,那么使用-p参数,会显示该命令的路径,相当于which命令。
type命令的使用实例:
$ type cd
系统会提示,cd是shell的自带命令(build-in)。
$ type grep
系统会提示,grep是一个外部命令,并显示该命令的路径。
$ type -p grep
加上-p参数后,就相当于which命令。