linux文件搜索-which、whereis、locate、find

2018-07-04 12:30:28

which 指令会从 $PATH 变量里指定的路径里搜寻并打印出绝对路径,一般用来搜寻可执行文件。

-a    列出全部而非第一个

[root@izj6cfw9yi1iqoik31tqbgz push]# which tcpdump
/usr/sbin/tcpdump


whereis 命令会从man文档路径,$PATH 指定的路径,以及一些源码路径。

-l    列出要搜寻的特定目录
-b    只找2进制文件
-m    只在搜寻man文档
-s    只找源文件
-u    查找其他文件
#列出whereis要搜寻的目录
[root@izj6cfw9yi1iqoik31tqbgz push]# whereis -l
bin: /usr/bin
bin: /usr/sbin
bin: /usr/lib
bin: /usr/lib64
bin: /etc
bin: /usr/etc
bin: /usr/games
bin: /usr/local/bin
bin: /usr/local/sbin
bin: /usr/local/etc
bin: /usr/local/lib
bin: /usr/local/games
bin: /usr/include
bin: /usr/local
bin: /usr/libexec
bin: /usr/share
man: /usr/share/man/ru
...
man: /usr/share/man/man2x
man: /usr/share/man/it
src: /usr/src/debug
src: /usr/src/kernels
[root@izj6cfw9yi1iqoik31tqbgz push]# whereis tcpdump
tcpdump: /usr/sbin/tcpdump /usr/share/man/man8/tcpdump.8.gz

[root@izj6cfw9yi1iqoik31tqbgz push]# whereis -b tcpdump
tcpdump: /usr/sbin/tcpdump


locate 命令会搜寻 /var/lib/mlocate 数据库来查找文件,速度快。但是一些新增的文件会搜索不到,因为默认情况下,locate 会一天更新一次数据库。

当然也可以手动运行 updatedb,会根据 /etc/updatedb.conf 的设置区搜寻系统硬盘内的文件名,并更新 /var/lib/mlocate 数据库文件。

当报如下错时证明没安装mlocate。

-bash: locate: command not found
-bash: updatedb: command not found
yum install mlocate

#ubuntu下apt-get mlocate
-i    忽略大小写的差异
-c    不输出文件名,仅计算找到的文件数量
-l    仅输出几行的意思,例如输出五行则是 -l 5
-S    输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等
-r    后面可接正则表达式的显示方式
[root@localhost lua]# locate tcpdump
/usr/sbin/tcpdump
/usr/share/doc/tcpdump-4.5.1
/usr/share/doc/systemtap-client-3.0/examples/network/tcpdumplike.meta
/usr/share/doc/systemtap-client-3.0/examples/network/tcpdumplike.stp
/usr/share/doc/tcpdump-4.5.1/CHANGES
/usr/share/doc/tcpdump-4.5.1/CREDITS
/usr/share/doc/tcpdump-4.5.1/LICENSE
/usr/share/doc/tcpdump-4.5.1/README.md
/usr/share/man/man8/tcpdump.8.gz
/usr/share/mime/application/vnd.tcpdump.pcap.xml


find 命令功能最强大,但是由于要搜索磁盘文件,所以速度会相对慢。

-mtime n    n为数字,意义为在 n 天之前的“一天之内”被更动过内容的文件
-mtime +n    列出在 n 天之前( 不含 n 天本身) 被更动过内容的文件文件名
-mtime -n    列出在 n 天之内( 含 n 天本身) 被更动过内容的文件文件名
-ctime
-atime
-newer file    列出比 file 还要新的文件文件名
-uid n 
-gid n 
-user name 
-group name 
-nouser        寻找文件的拥有者不存在 /etc/passwd 的人!
-nogroup       寻找文件的拥有群组不存在于 /etc/group 的文件!
-name  filename  文件名
-iname            不区分大小写 
-size +/-10M	   搜寻+比size大/-小,k,m,g

-type    f-正规文件  b-块文件  c-字符文件	d-目录 	l-链接文件   s-socket    p-FIFO
-perm  mode    搜寻文件权限假设为4744
-perm  -mode   搜寻文件权限 >=4744   如6755 4766 都是
-perm  /mode   搜寻文件权限被mode(4744)包含  如4000,0700,0744
-inum xxx      根据inode号码搜索

-exec 执行命令,查询的结果会放在{}里

-maxdepth n   最大层数
-mindepth n   最小层数

-print0  以\0空字符分割来代替换行符,对文件名包含空格或换行符很有用
        一般与xargs -0 配合使用
find /root -mtime 0    #当天修改过
find /root -mtime 1    #昨天修改过
find /root -mtime 2    #前天修改过

find /root -mtime +2    #2天前修改过
find /root -mtime -2    #2天之内修改过
#以文件名来查找
[root@localhost lua]# find /usr/include/ -name stdio.h
/usr/include/bits/stdio.h
/usr/include/stdio.h
/usr/include/c++/4.8.2/tr1/stdio.h

#也可以用通配符
[root@localhost lua]# find /etc -name '*locate*'
/etc/selinux/targeted/active/modules/100/slocate
/etc/cron.daily/mlocate
/etc/postfix/relocated

#查找当前目录的文件,排除tmp.lua
[root@localhost tmp]# find ./ ! -name tmp.lua -type f
#只搜寻1层
[root@localhost tmp]# find /usr/include -maxdepth 1 -type d
/usr/include
/usr/include/asm
...
/usr/include/krb5
/usr/include/openssl
#以查询的结果当做执行的参数
[root@localhost lua]# find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \;
-r-xr-sr-x. 1 root tty 15344 Jun  9  2014 /usr/bin/wall
...
-rwsr-xr-x. 1 root root 11296 Nov  5  2016 /usr/sbin/usernetctl
-rwxr-sr-x. 1 root postdrop 218552 Jun  9  2014 /usr/sbin/postdrop
-rwxr-sr-x. 1 root postdrop 259992 Jun  9  2014 /usr/sbin/postqueue

1.{} 代表的是“由 find 找到的内容”,find 的结果会被放置到 {} 位置中;
2.-exec 一直到 \; 是关键字,代表 find 额外动作的开始 (-exec) 到结束 (\;)。 
3.因为 ; 在 bash 环境下是有特殊意义的,因此利用反斜线来转义。

排除搜索

排除掉 /usr/include/linux 及其子目录

find /usr/include -path /usr/include/linux -prune -o -type d -print

上面这句话的意思是,先执行 find /usr/include 返回结果然后遍历,当满足条件 '-path /usr/include/linux' 时不打印,如果不满足,则打印类型为 d 的目录。

排除多个文件夹

find /usr/include \( -path /usr/include/linux -o -path /usr/include/c++ \) -prune -o -type d -print


备注:
1.本系列命令都在centos7里测试,其他发行版如ubuntu、debian、fedora、opensuse等可能略微不同
2.本文只讲解常用用法,详细用法请自行利用 man 命令查看
3.原文地址http://www.freecls.com/a/2712/80

 

©著作权归作者所有
收藏
推荐阅读
简介
天降大任于斯人也,必先苦其心志。