Linux的文件检索(locate、find、which、whereis)
说明:
Linux系统中查找文件的方法不同于Windows系统,在Windows系统中查找文件的方法比较容易,只要在桌面上点击“开始”-“搜索”中就能按照各种方式进行查找,对于Linux新手来讲,在Linux系统中查找一个文件比较困难,它不像Windows那样方便,在Linux中通常使用命令来查找文件,常见查找文件的命令有locate、which、whereis和find等。
文件检索
- locate(uodatedb)
- find
- which
- whereis
详细解释
locate
说明:locate命令要比其他查找文件命令(例如:find)快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/mlocate/mlocate.db
这个数据库是干什么的?
这个数据库中含有本地所有文件信息。Linux 系统自动创建这个数据库,并且每天自动更新一次,因此,在用locate查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。
语法规则:locate 命令参数 文件/目录
参数解释:
-
-c, --count 只输出找到的数量;
-
-d, --database DBPATH 使用DBPATH指定的数据库,而不是默认数据库/var/lib/mlocate/mlocate.db;
-
-i, --ignore-case 忽略大小写;
-
-q, --quiet 安静模式,不会显示任何错误讯息;
-
-e, --existing 只显示当前存在的文件条目;
前期工作:安装包、更新数据库
-
yum install mlocate
-
sudo updatedb
演示:
- 检索etc目录下以ssh开头的文件或目录
- 检索包含ssh字母的文件或目录总个数
一般情况下,locate要与updatedb配合起来用
updatedb
说明:
updatedb命令用来创建或更新locate命令所必需的数据库文件。updatedb命令的执行过程较长,因为在执行时它会遍历整个系统的目录树,并将所有的文件信息写入locate数据库文件中。
使用方法:updatedb 命令参数
命令参数解释:
- -o<文件>:忽略默认的数据库文件,使用指定的slocate数据库文件;
- -U<目录>:更新指定目录的slocate数据库;
- -v:显示执行的详细过程;
演示:
- 新创建一个testFile文件,更新locate数据库后使用locate命令定位该文件,如果不更新,则查不到
- 删除testDir文件,更新locate数据库后使用locate命令定位该文件
上图的思路是这样的,创建了一个目录文件,然后立即用locate查找,可以发现是不能查到的,而更新数据库后可以查找到,但是,此时将这个目录文件删除,则还是能查找到,那是因为数据库没有没有更新,此时用-U参数来更新指定的路径,然后查询,可以看到目录文件不存在
find
说明:按照自定义的方法查找任何文件,用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find
命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
语法:find 查找目录 查找参数 查找内容
参数解释:
- -amin<+|-分钟>:查找在指定时间曾被存取过的文件或目录,单位以分钟计算;
-
- -atime<+|-24小时数>:查找在指定时间曾被存取过的文件或目录,单位以24小时计算;
-
- -cmin<+|-分钟>:查找在指定时间之时被更改过的文件或目录;
-
- -ctime<+|-24小时数>:查找在指定时间之时被更改的文件或目录,单位以24小时计算;
-
- -mmin<+|-分钟>:查找在指定时间曾被更改过的文件或目录,单位以分钟计算;
-
- -mtime<+|-24小时数>:查找在指定时间曾被更改过的文件或目录,单位以24小时计算;
-
- -depth:从指定目录下最深层的子目录开始查找;
-
- -exec<执行指令>:假设find指令的回传值为True,就执行该指令;
-
- -follow:排除符号连接;
-
- -gid<群组识别码>:查找符合指定群组识别码的文件或目录;
-
- -group<群组名称>:查找符合指定群组名称的文件或目录;
-
- -uid<用户识别码>:查找符合指定的用户识别码的文件或目录;
-
- -user<拥有者名称>:查找符和指定的拥有者名称的文件或目录;
-
- -name<范本样式>:指定字符串作为寻找文件或目录的范本样式;
-
- -iname<范本样式>:此参数的效果和指定“-name”参数类似,但忽略字符大小写的差别;
-
- -inum<inode编号>:查找符合指定的inode编号的文件或目录;
-
- -newer<参考文件或目录>:查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
-
- -size<+|-|=文件大小>:查找符合指定的文件大小的文件;
-
- -type<文件类型>:只寻找符合指定的文件类型的文件;
-
- -a:是前后条件都要满足;
-
-
-
-
-
- +:表示大于设置值的文件;
- - :表示小于设置值的文件;
- = :表示等于设置值的文件;
-
-
- -o :是满足一个条件就好;
演示:
- 查找
/etc
目录下以.conf
结尾的文件或目录 *表示任意字母
- 查找
/etc
目录下在超过7
天前被访问的文件或目录
- 查找
/etc
目录下恰好在7
天前被访问的文件或目录
find /etc -atime 7
- 查找
/etc
目录下在5
分钟内被访问的文件或目录
find /etc -amin -5
一些常用参数的使用方法:
-type 文件类型
常见文件类型:
- f:普通文件
- l:符号链接
- d:目录
- c:字符设备
- b:块设备
- s:套接字
- p:Fifo
演示:
- 查找
/etc
目录下以my
开头的目录
find /etc -name "my*" -a -type d
size <+|-|=文件大小>
常见文件大小单位:
- b —— 块(512字节)
- c —— 字节
- w —— 字(2字节)
- k —— 千字节
- M —— 兆字节
- G —— 吉字节
演示:
- 查找
/etc
目录下大于1M
的文件
find /etc -size +1M
-exec
find … -exec 要执行的命令 {} ;
-exec
选项后面跟随着所要执行的命令或脚本,然后是一个空格一对儿{}
一个空格和一个;
。
注意:要执行的命令和{
之间以及}
与;
之间的空格是不能省略的。
演示:
1.查找/etc
目录下大于1M
的文件/目录的详细信息
find /etc -size 1M -exec ls -l {} ;
2.查找/root
目录中类型为符号链接且文件名以 Link 结尾的所有链接详细数据
find /root -type l -name “*Link” -exec ls -l {} ;
which
说明:
which命令主要是用来查找系统PATH目录下的可执行文件,说白了就是查找那些我们已经安装好的可以直接执行的命令,比如passwd su telnet ssh rm 等对于Linux命令的学习,请点击这里
which命令用于查找并显示给定命令的绝对路径,环境变量PATH中保存了查找命令时需要遍历的目录。which指令会在环境变量$PATH设置的目录里查找符合条件的文件。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令
语法:which 命令
演示:
whereis
说明:
whereis命令可以用来查找二进制(命令)、源文件、man文件。与which不同的是这条命令可以是通过文件索引数据库而非PATH来查找的,所以查找的面比which要广
语法:whereis 命令参数 文件名
参数解释:
- -b:只查找二进制文件;
- -B<目录>:只在设置的目录下查找二进制文件;
- -m:只查找说明文件;
- -M<目录>:只在设置的目录下查找说明文件;
- -s:只查找原始代码文件;
- -S<目录>只在设置的目录下查找原始代码文件;
演示:
比较:
locate
命令的优点就是查找速度比find
命令快的多,但是缺点也比较明显,locate
命令无法查找最新添加的文件/目录以及会查找出来已经过期的文件/目录。find
命令的优点就是可以按照自定义的方法查找任何文件,缺点就是查询速度比较慢,因为是通过遍历硬盘来查找而不像locate
命令事先建立好数据库来进行查找。