首页 > 代码库 > linux下的文件查找命令

linux下的文件查找命令

文件查找:按照文件名或文件属性来搜索文件;

一)locate

    模糊查找:
        基于专用的数据库进行查找,数据库应该事先创建,并且定期更新;
        可以使用updatedb命令手动更新locate数据库;
        查找速度非常快,查找精确到非常有限;


=============================================================
二)find

    精确查找:
        查找精度高,速度略慢;
        在指定的位置进行文件名或文件属性的遍历扫描;强烈不建议对根目录进行find操作;
        实时查找;
        使用find命令只能搜索当前用户具有读取和执行权限的目录;

    find命令:
        find - search for files in a directory hierarchy
        find [OPTIONS...] [查找路径] [查找条件] [处理动作]
            查找路径:默认为当前工作目录,可以指定具体的目录路径;
            查找条件:进行本次搜索的标准,可以是文件名、文件大小、文件类型、文件权限等等;默认是指定目录中的所有文件;
            处理动作:对于符合条件的文件进行某个处理操作;默认将查找结果输出到显示器;

        根据文件名查找:
            -name 文件名称,支持使用Globbing,(*, ?, [], [^])
            -iname 文件名称,忽略字母大小写,支持使用Globbing,(*, ?, [], [^])

        根据文件的inode编号查找:
            -inum inode编号:通过给定的inode编号查找对应的文件名及路径;
            -samefile name:通过给定的文件名查找对应的inode编号,进而确定所有具有该inode编号的文件名及路径;
            -links n:查找链接数为n的所有文件;

        根据正则表达式查找:
            -regex pattern:以pattern匹配整个文件路径字符串,而不仅仅是给定文件的名称;

        根据文件的属主和属组进行查找:
            -user uname:根据属主为指定用户的用户名进行查找
            -uid UID:根据属主为某个UID进行查找
            -group gname:
            -gid GID:

            -nogroup:在文件的属组上没有组对应的组名;
            -nouser:在文件的属主上没有用户对应的用户名;

        根据文件的类型查找:
            -type 文件类型:
                b:块设备
                c:字符设备
                d:目录文件
                f:普通文件
                l:符号链接文件
                p:管道文件
                s:套接字文件
            -xtype 文件类型:符号链接文件的匹配需要配合其他的选项;

        根据时间戳进行查找:
            以天为单位:
                -atime [+|-]n:根据访问时间查找
                -ctime [+|-]n:根据改变时间查找
                -mtime [+|-]n:根据修改时间查找
                    n:[n,n+1)
                    +n:[n+1,+∞)
                    -n:[now,n)
            以分钟为单位:
                -amin [+|-]n
                -cmin [+|-]n
                -mmin [+|-]n

            例子:
                5-28-11-18
                    -mtime -3
                5-25-11-18
                    -mtime 3
                5-24-11-18
                    -mtime +3

        根据文件的大小进行查找:
            -size [+|-]n[cwbkMG]
                n:(n-1,n]
                -n:[0,n-1]
                +n:(n,+∞)

            例子:
                find -size +2k
                    当前目录下所有大于2KB的文件;
                find -size 2k
                    当前目录下所有1KB-2KB之间的文件;
                find -size -2k
                    当前目录下所有小于1KB的文件;

        组合条件:
            -a:逻辑与,默认可以省略;
            -o:逻辑或
            -not, !:逻辑非

            逻辑组合条件遵循德摩根定律:
                非(A 与 B) == 非A 或 非B
                非(A 或 B) == 非A 与 非B

        根据权限查找:
            -perm [/|-]mode
                mode:精确匹配指定的权限
                /mode:隐含了逻辑或的关系,任何一个权限位的权限中只要能有一个权限匹配,即可满足条件;
                -mode:隐含了逻辑与的关系,每一个权限位的权限中都必须同时包含指定权限位,才能满足条件;

            所有都有 取反 任意一个没有
                ! ( a与b与c ) = !a 或 !b 或 !c
            所有都没有 取反 任意一个有
                !    ( !a与!b与!c ) = a 或 b 或 c

    处理动作:
        -print:输出到显示屏幕,默认的动作;
        -ls:对与查找到的结果执行ls -li命令显示;    
        -exec COMMAND {} \;:
        -ok COMMAND {} \;:
            对于查找到的结果执行COMMAND命令;
            区别:
                -exec是非交互式的;
                -ok是交互式的;
            {}:占位符,用来引用被find命令查找到的所有的文件的路径信息;

        -exec和-ok的取代执行操作:
            chmod a-r $(find -perm -444 -type f)
            find -perm -444 -type f | xargs chmod a-r

        注意:管道输送的是纯字符串信息,所以如果管道之后的命令不是处理字符串的命令,需要使用xargs命令将其转换成能够被后面命令处理的参数;

=============================================================
举几个栗子:


查当前目录下的所有普通文件
# find . -type f -exec ls -l {} \;
-rw-r–r–    1 root      root         34928 2003-02-25   ./conf/httpd.conf
-rw-r–r–    1 root      root         12959 2003-02-25   ./conf/magic
-rw-r–r–    1 root      root          180 2003-02-25   ./conf.d/README
查当前目录下的所有普通文件,并在- e x e c选项中使用ls -l命令将它们列出

=================================================
在/ logs目录中查找更改时间在5日以前的文件并删除它们:
$ find logs -type f -mtime +5 -exec   -ok   rm {} \;

=================================================
查询当天修改过的文件
]# find   ./   -mtime   -1   -type f   -exec   ls -l   {} \;


=================================================
查询并交给awk去处理
]# who   |   awk   ’{print $1"\t"$2}’
cnscn    pts/0

=================================================
awk—grep—sed

]# df   -k |   awk ‘{print $1}’ |   grep   -v   ’none’ |   sed   s"/\/dev\///g"
文件系统
sda2
sda1
]# df   -k |   awk ‘{print $1}’ |   grep   -v   ’none’
文件系统
/dev/sda2
/dev/sda1
1)在/tmp中查找所有的*.h,并在这些文件中查找“SYSCALL_VECTOR",最后打印出所有包含"SYSCALL_VECTOR"的文件名

A) find   /tmp   -name   "*.h"   | xargs   -n50   grep SYSCALL_VECTOR
B) grep   SYSCALL_VECTOR   /tmp/*.h | cut    -d’:‘   -f1| uniq > filename
C) find   /tmp   -name "*.h"   -exec grep "SYSCALL_VECTOR"   {}   \; -print

2)find / -name filename -exec rm -rf {} \;
    find / -name filename -ok rm -rf {} \;

3)比如要查找磁盘中大于3M的文件:
find . -size +3000k -exec ls -ld {} ;






本文出自 “fuboyuan” 博客,谢绝转载!

linux下的文件查找命令