文本查找: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