文本查找:grep egrep fgrep
文件查找:locate、find
locate和find的区别
locate有自维护的数据库(linux自建,与所有文件关联),每天linux会定时对其进行更新,而locate就在此数据库中查找,所以查询速度非常快,但是缺点也很明显,不能实时查找(比如刚装linux时这条命令是不能用的),支持的查找方式少。
find的优点和缺点与locate相对应,find 遍历指定的路径,用以查找文件,所以当指定路径下的文件数量越多,find的查找效率越低,但是find 支持查找的格式非常多,比如根据文件名查找,元属性状态查找,还支持正则等等。
locate:
非实时,模糊匹配,查找是根据全系统文件数据库进行的;
速度快
#updatedb,手动生成文件数据库
find:
实时
精确
支持众多查找标准
遍历指定路径中的所有文件进行查找,速度慢
find 查找路径 查找标准 查找到以后的操作
查找路径:默认为当前路径
查找(匹配)标准:默认为指定路径下的所有文件
处理操作:默认为显示
匹配标准:
-name ‘filename’:对文件名进行精确匹配
文件名通配:
*:任意长度的任意字符
?:单个长度的任意字符
[]:
...
-iname ’filename‘ 匹配时忽略大小写
-regex pattern :基于正则表达式对文件进行匹配
pattern必须用绝对路径包含
-user username:根据属主查找
-group groupname:根据属组查找
-uid UID:根据uid查找
-gid GID:根据gid查找
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
-type:
p:普通文件
s:socket文件
d:目录文件
p:管道文件
l:链接文件
...
-size
[+|-]#k:查找[大于|小于]#k的文件
[+|-]#M:查找[大于|小于]#M的文件
[+|-]#G:查找[大于|小于]#G的文件
注意:find 命令里面查找文件大小并不是精确的,它会把大于上一个数到小于下一个数之间的数当成当前数,比如我们查找等于10k的文件,那么9.2k、9.31k、10.1k等等都会被当成10k而被匹配到,而9k 11.1k等就不会
组合条件:
-a:与
-o:或
-not:非
-mtime:根据修改(modify)时间
-atime:访问(access)时间
-ctime:改变(change)时间
[+|-]#:+代表某个时间之前,-代表之后,time默认是天
(atime和ctime区别:atime修改数据,ctime修改元属性)
-mmin:
-cmin:
-amin:
[+|-]#:
与time对应,min代表分钟
-perm MODE:完全匹配mode,比如755必须完全匹配755
/MODE:部分匹配mode,只要一个匹配就可以了,比如r--rw----,只要这三个位置中其他一个被匹配到就可以了,比如可以匹配的有:r--------、rw-------等等
-MODE:完全包含匹配,匹配的mode必须等于或者可以包含MODE,比如r--rw----,那么r--rwx---、rw-rw----等可以匹配,而---rwxrwx、rwxr-xrwx等不可以匹配
find 利用正则匹配示例:
[root@logstash ~]# find /etc/ -regex "\<pas.*"
[root@logstash ~]# find /etc/ -regex "/etc/\<pas.*"
/etc/passwd
/etc/passwd-
处理操作:
-print:显示
-ls:类似ls -l的格式显示匹配到的文件的详细信息
-ok COMMAND {} \;每一次操作都需要用户确认
-exec COMMAND {} \;
{}代表匹配到的文件,\;是固定结束符
xargs与find -exec示例
[root@localhost ~]# find /tmp/ -size -1M -exec echo {} >>tmp.txt \;
[root@localhost ~]# cat tmp.txt
/tmp/mysql.sock
/tmp/sess_e538a6cd81b0fed9d5c49f1b2f84dd80
/tmp/sess_c1f3bd3446ca4407d9a2a05bb4897030
[root@localhost ~]# find /tmp/ -size -1M |xargs echo {} >>tmp1.txt ;
[root@localhost ~]# cat tmp.txt
/tmp/mysql.sock
/tmp/sess_e538a6cd81b0fed9d5c49f1b2f84dd80
/tmp/sess_c1f3bd3446ca4407d9a2a05bb4897030
[root@localhost ~]#
示例:
1、查找/var下属主为root并且属组为mail的所有文件
find /var/ -user root -group mail
2、查找/usr不属于root、bin或student的文件
find /usr/ -not -user root -o -not -user bin -o -not -user student
find /usr/ -not \(-user root -o -user bin -o -user student \)
3、查找/etc下最近一周内内容修改过且不属于root以及student用户的文件
find /etc/ -mtime -7 -not -user root -a -not -user student
find /etc/ -mtime -7 -not \(-user root -o -user student\)
4、查找当前系统上没有属组或属主且最近1天内曾被访问过的文件、并将其属主属组修改为root
find / -nouser -o -nogroup -a -ctime -1 -exec chown root:root {} \;
5、查找/etc/下大于1M的文件,并写入到/tmp/1.txt中
find /etc/ -size +1M -exec echo {} >>/tmp/1.txt \;
6、查找/etc/所有用户都没有写权限的文件,并显示其详细信息
find /etc/ -not -perm /222 -ls
注意这里是用/222 而不是-222