前言
Linux的基本特性之一就是一切皆文件,在系统管理过程中难免会遇到需要查找各种类型文件的问题,那么如何准备快速的查找定位呢,本文将对Linux系统中文件查找工具及用法进行详解;
常见工具对比
常见的文件查找工具主要有locate(非实时查找)和find(实时查找)。locate查找依赖于索引,而索引构建相当暂用资源,索引的创建是在系统空闲时由系统自动进行(每天任务),手动创建可以使用updatedb命令,查找速度快但结果非精确,即为模糊查找。而find相对于locate而言,是遍历所有文件进行条件匹配,查找速度慢但是结果精确,即为精准查找。简而言之,对于实际生产环境,find(实时查找)无意更加高效。
常见查找类命令
名称:whereis
功能:定位文件所在目录
用法:whereis shell命令
注意:whereis是根据环境变量PATH来查找文件的,而PATH通常设置成存放命令的那些路径,如/bin、/sbin、/usr/bin等。因此whereis的用途仅限于定位shell命令所在的位置。
[root@mail ~]# whereis ifconfig ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
名称:locate
功能:locate 文件名或者目录名
说明:locate默认是不被安装的,它的包名叫:mlocate可以直接使用yum安装即可。locate也是系统中常用查找文件的方法,但是它并不是直接从磁盘实时查找文件,而是由updatedb命令所产生的信息库中查找相应的文件和目录。
注意:如果locate找不到某个命令,但是又确定该文件存在时,是由于updatedb生成的信息库已经过期,此时你只需要以root的身份执行updatedb命令,重新建立整个系统所有文件和目录的资料库。但是updatedb命令比较暂用资源,一般不建议手动更新。
find命令的用法
命令格式:
find [options] [查找路径] [查找条件] [处理动作]
查找路径:默认为当前路径
查找条件:默认为指定目录下的所以文件
处理动作:默认为显示至屏幕
条件查找
-name "文件名称":支持使用globbing字符 *:任意长度任意字符 ?:任意单个字符 []:范围内任意字符 [^]:范围外任意字符 -iname "文件名称":查找时忽略字符大小写 -user USERNAME: 根据文件的属主查找 -group GRPNAME: 根据文件的属组查找 -uid UID:根据用户UID查找 -gid GID:根据用户GID查找 -nouser: 查找没有属主的文件 -nogroup: 查找没有属组的文件
组合条件查找
-a:与,同时满足 -o:或,满足一个即可 -not:!非,条件取反
文件类型查找
-type TYPE:根据文件类型查找 f:普通文件 d:目录文件 l:符号链接 b:块设备 c:字符设备 s:套接字文件 p:命名管道 -size [+|-]#UNIT:根据文件大小查找 常用单位:k,M,G #UNIT:#-1<x<=# -#UNIT:x<=#-1 +#UNIT:x># (x为匹配到的文件大小)
时间戳查找
以“天”为单位 -atime(访问时间) [+|-]# +#:x>=#+1 -#:x<# #:#<=x<#+1 (x为匹配到的文件时间) -mtime(修改时间) -ctime(改变时间) 以“分钟”为单位 -atime -mtime -ctime (用法同上)
权限查找
-perm [+|-]MODE MODE:与MODE精确匹配 +MODE: 任何一类用户的权限只要能包含对其指定的任何一位权限即可 -MODE:每类用户指定的检查权限都匹配
处理动作
-print: 默认处理动作,显示 -ls:类似于ls -l -exec COMMAND {} \; -ok COMMAND {} \; #find一次性查找符合条件的所有文件,并一同传递 给-exec或-ok后面指定的命令,但有些命令不能接受过长的参数,此时使用另一种方式: find | xargs COMMAND
find实战
1、查找/etc/init.d/目录中包含e并已s结尾的文件并复制到/tmp下 [root@mail ~]# ls /etc/init.d/ auditd ip6tables mdmonitor network ntpdate rsyslog sshd crond iptables messagebus nginx postfix sandbox svnserve functions kdump netconsole nginx-debug rdisc saslauthd udev-post halt killall netfs ntpd restorecond single [root@mail ~]# find /etc/init.d/ -name "*e*s" -exec cp {} /tmp \; [root@mail ~]# ls /tmp ip6tables iptables messagebus netfs 2、查找/var/目录属主为root且属组为mail的所以文件 [root@mail ~]# find /var/ -user root -group mail /var/spool/mail /var/spool/mail/root 3、查找/usr/目录下不属于root、bin或bjwf的所有文件 [root@mail ~]# find /usr/ -not \( -user root -o -user bin -o -user bjwf \) /usr/local/nginx /usr/local/nginx/sbin /usr/local/nginx/sbin/nginx 4、查找/tmp目录下最近7天内修改过且不属于root和bjwf的文件并显示属性信息 [root@mail ~]# find /tmp -mtime -7 -not \( -user root -o -user bjwf \) -ls 262152 0 -rw-r--r-- 1 nginx nginx 0 5月 23 14:58 /tmp/sum.sh 5、查找当前系统上没有属主或属组,且最近1个月内曾被访问过的文件 [root@mail ~]# find / \( -nouser -o -nogroup \) -a -atime -30 6、查找/etc/目录下大于1M且类型为普通文件的所有文件 [root@mail ~]# find /etc/ -type f -size +1M /etc/pki/tls/certs/ca-bundle.trust.crt /etc/selinux/targeted/modules/active/policy.kern /etc/selinux/targeted/policy/policy.24 7、查找/etc/目录所有用户都没有写权限的文件 [root@mail ~]# find /etc/ -not -perm +222 /etc/openldap/certs/password /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt /etc/pki/ca-trust/extracted/java/cacerts /etc/pki/ca-trust/extracted/pem/email-ca-bundle.pem /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem /etc/ld.so.conf.d/kernel-2.6.32-573.el6.x86_64.conf /etc/shadow /etc/gshadow /etc/shadow- /etc/sudoers 8、查找/etc/目录下至少有一类用户没有写权限 [root@mail ~]# find /etc/ -not -perm -222 > /tmp/perm [root@mail ~]# wc -l /tmp/perm #文件太多,所以追加到/tmp/perm下 1019 /tmp/perm 9、查找/etc/rc.d/目录下,所有用户都有执行权限且其它用户有写权限的文件 [root@mail ~]# find /etc/rc.d -perm -113 > /tmp/perm.113 [root@mail ~]# wc -l /tmp/perm.113 163 /tmp/perm.113 10、在/apps/audit目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限 # find /apps/audit -perm -7 -print | xargs chmod o-w
本文出自 “把酒问苍天” 博客,请务必保留此出处http://79076431.blog.51cto.com/8977042/1782119
原文地址:http://79076431.blog.51cto.com/8977042/1782119