美文网首页
Linux-find命令学习

Linux-find命令学习

作者: 骑着乌龟去看海 | 来源:发表于2019-06-15 15:16 被阅读0次

    一、前言

      find命令用于在指定目录下查找文件,并且搜索完成后可以执行相应的操作,搜索时我们可以根据参数指定相应的搜索条件,比如按文件名,文件类型,时间戳等。find命令的功能特别强大,今天就来简单学习下它的使用。

    二、命令介绍

    首先,我们find --help一下,可以看到find命令的格式为:

    find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
    

    好像看上去比较复杂,没事一般的时候我们也用不到,我们来简化一下这个格式:

    find path -options[-print][-exec][-ok][...]
    

    这里介绍下相应的参数:

    • path,表示find命令所查找的目录,比如用.来表示当前目录,用/来表示系统根目录;
    • -print,表示将查找到的文件输出到标准输出,如果没有指定,默认是该模式;
    • -exec,对查找到的文件执行该参数所给出的shell命令,相应命令的形式为'command' {} ;,注意 {} 和 \ ; 之间的空格;
    • -ok,和-exec选项功能类似,但该选项更安全,在执行每一个命令之前,都会给出提示,让用户来确定是否执行;

    另外,相应的查询参数:

    -name   按照文件名查找文件;
    -iname  按照文件名查找,但会忽略大小写;
    -perm   按照文件权限来查找文件;
    -prune  查找时忽略某目录;
    
    -path pattern:根据完整路径查找文件名为pattern的文件;
    -ipath:忽略大小写;
    
    -empty:查找文件为空而且是一个普通文件或者目录;
    
    -type  查找某一类型的文件,比如:
    b -块设备文件;
    c -字符设备文件;
    d -目录;
    p -管道文件;
    f -普通文件;
    l -符号链接文件;
    s -socket文件;
    
    -amin n   查找系统中最后N分钟访问的文件
    -atime n  查找系统中最后n天访问的文件
    -cmin n   查找系统中最后N分钟被改变文件状态的文件
    -ctime n  查找系统中最后n天被改变文件状态的文件
    -mmin n   查找系统中最后N分钟被改变文件数据的文件
    -mtime n  查找系统中最后n天被改变文件数据的文件
    

    其中 -size表示按照文件大小来查找,这里来详细说下:格式为 -size +1000n,其中n表示单位:

    • c 以字节单位;
    • b 以块为单位,其中块大小为512字节,这个是默认单位;
    • w 以words为单位,words表示两个字节;
    • k 以1024字节为单位,也就是kilo bytes,kb;
    • M-类似,以1024*1024字节为单位,也就是Mb;
    • G-Gb;

    另外,这里的前缀+-,和时间是同一个意思,加号表示查找大于给定长度的文件,减号则是表示查找小于给定长度的文件;

    三、实例

    接下来,我们通过一些实例来看一下find命令的使用。首先,先看下最基础的查找模式,也就是默认是-print的模式。

    1. print 标准模式
    1.1 查找48小时内修改过的文件
    master@127.0.0.1:~$ find -atime -2
    ./.bash_profile
    ./.viminfo
    ./.viminfz.tmp
    ./.bash_history
    ./.bash_logout
    
    1.2. 查找当前目录下以某个格式结尾的文件
    master@127.0.0.1:/logs$ find . -name "*.log"
    ./redis.log
    ./test1.log
    ./test2.log
    ./test3.log
    ./test4.log
    

    由于展示结果是类似的,所以这里只列相应的命令。
    1.3)查找/logs目录下权限为 644的文件:

    master@127.0.0.1:/logs$ find /log -perm 644
    

    另外,我们在使用八进制查询的时候,可以在八进制数字前面加一个横杠 -,表示都匹配,如-007就相当于777,-005相当于555;
    1.4)查找当目录以.log结尾的普通文件:

    master@127.0.0.1:/logs$ find . -type f -name "*.log"
    

    1.5)查找当前所有目录并排序:

    master@127.0.0.1:/logs$ find . -type d | sort
    

    1.6)查找当前目录大于1k的文件:

    master@127.0.0.1:/logs$ find . -size +1000c -print
    .
    ./temp
    ./temp/test-master
    ./lib
    ./lib/netty-codec-4.1.14.Final.jar
    ./lib/spring-rabbit-2.0.1.RELEASE.jar
    

    这里,大于与小与的查询是可以同时使用的,如 查询 文件大小大于2M小于10M的:

    master@127.0.0.1:/logs$ find . -size +2M -size -10M -print
    

    1.7)在/目录下查找/start开头并且以end结尾的文件

    master@127.0.0.1:/logs$ find / -path "/start*end"
    

    1.8)如果在查找文件时希望忽略某个目录,我们可以使用-prune选项,但使用的时候需要注意下,因为如果同时使用了-depth选项,那么-prune选项就会被find命令忽略,如果希望在test目录下查找文件,但不希望在test/test3目录下查找,可以使用:

    master@127.0.0.1:/logs$ find test -path "test/test3" -prune -o -print
    

    1.9)另外,我们可以借助-printf 来打印查找到的文件的相应属性,比如时间,大小等;

    master@127.0.0.1:/logs$ find -type f -printf '%T+%p \n'
    2019-06-10+16:18:39.8681443600./logs/test2.log
    

    有关更多printf,可以参考:http://man.he.net/man1/find,然后搜索 **printf **,即可看到所有的选项。

    2. exec 与ok 模式

    如果只是查找的话,上面的这些查询已经够我们平时用了,不过我们有时候不仅仅是只查找一下,可能还会有后缀的操作,这个时候就要使用-exec模式了。

    -exec后面跟的是shell命令,表示查询出对应的文件后进行其他命令操作。该模式结束是以 ; 为标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面会加反斜杠。

    该命令格式一般为:

    find path -exec command' {} \;
    

    首先是exec选项,后面是要执行的命令或脚本,然后是一对{ },一个空格和一个\,最后是一个分号。其中花括号代表前面find查找出来的文件名;

    2.1 查看并列出对应文件:
    master@127.0.0.1:/logs$ find . -type f -exec ls -l {} \;
    

    要注意末尾的花括号与斜杠之间的空格;

    2.2 查找并删除修改时间在2天以前的文件:
    master@127.0.0.1:/logs$ find . -type f -mtime +2 -exec rm {} \; 
    

    在任何删除之前,都应该先查看相应的文件,以免进行误删除操作;而 -ok 选项则可以看作是exec的安全模式,它会在删除前提示你进行确认:

    master@127.0.0.1:/logs$ find . -name "*.log" -ok rm {} \; 
    < rm ... ./test2.log > ? y
    

    它会在删除前进行确认,按y键进行删除,按n键取消删除;

    2.3 查找文件并查找文件中的内容:

    任何形式的命令都可以在exec选项中使用,这里我们可以使用grep来配合find命令:

    master@127.0.0.1:/logs$  find /test -name "passwd*" -exec grep "root" {} \;
    

    这里首先查找所有文件名以“passwd”开头的文件,然后执行grep命令看看在这些文件中是否存在一个root用户。

    2.4 查找并复制文件到指定目录:

    另外如果查找后移动或者复制文件到某个目录下的话,新的目录在花括号后指定,如:

    master@127.0.0.1:/logs$ find . -name "*.log" -exec cp {} test3 \;
    

    四、总结

    当然除了这几种模式外,还有其他的模式,比如-execdir-okdir等,等用到的时候再回来更新吧。

    本文参考自:
    每天一个linux命令(22):find 命令的参数详解
    https://www.cnblogs.com/peida/archive/2012/11/15/2770888.html
    http://man.he.net/man1/find
    Linux中find命令使用-linux.cn

    相关文章

      网友评论

          本文标题:Linux-find命令学习

          本文链接:https://www.haomeiwen.com/subject/ytubfctx.html