find

作者: 抠脚大汗 | 来源:发表于2018-10-16 23:53 被阅读0次

    find语法格式

    usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
           find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]
    

    find定义

    find 每输出一个文件名, 后面都会接着输出一个换行符 ('n')

    find参数

    (1)查找具有某些特征文件的命令,可遍历当前目录甚至于整个文件系统来查看某些文件或目录,其遍历大的文件系统时一般放在后台执行。
    (2)find命令的一般形式
    find pathname -options [-print -exec -ok]
    -pathname :find命令所查找的目录路径。如用"."来表示当前的目录,用/来表示系统根目录
    -print :find命令将匹配的文件输出到标准输出
    -exec: find命令对匹配的文件执行该参数所给出的shell命令,相应的命令形式为
    'command'{} ; (注意{}和\之间的空格)
    -ok 和 -exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
    options有如下几种:
    -name :按照文件名查找文件
    -perm :按照文件权限来查找文件
    -user :按照文件属主来查找文件
    -group :按照文件所属的组来查找文件
    -mtime -n +n 按照文件的更改时间来查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。find命令还有-atime 和-ctime选项,但它们都和-mtime选项相似。
    -size n[c]查找文件长度为n块的文件,带有c时表示文件长度以字节计。
    -nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在
    -newer file1 !file2查找更改时间比文件file1新但比文件file2旧的文件
    -depth 先查找指定目录有无匹配文件,若无则再在子目录中查找
    -type 查找某一类型的文件,如
    b :块设备文件
    d:目录
    e:字符设备文件
    p;管道文件
    l:符号链接文件
    f:普通文件
    (3)find命令举例
    find -name "*.txt" -print 查找txt结尾的文件并输出到屏幕上
    find /cmd ".sh" -print 查找/cmd目录下所有sh文件,并输出
    find . -perm 755 -print 查找当前目录下权限为755的文件,并输出
    find pwd -user root -print 查找当前目录下属主为root的文件,并输出
    find ./ -group sunwill -print 查找当前目录下所属主是sunwill的文件
    find /var -mtime -5 -print 查找/var目录下更改时间为5天内的所有文件
    find /var -mtime +5 -print 查找/var目录下更改时间为5天以前的所有文件
    find /var -newer "myfile1" ! -newer "myfile2" -print 查找/var目录下比myfile1新,但是比myfile2旧的所有文件。
    find /var -type d -print 查找/var目录下所有目录
    find /var -type l -print 查找/var目录下所有的符号链接文件。
    find . -size +1000000c -print 查找当前目录下大于1000000字节的文件
    find / -name "con.file" -depth -print 查找根目录下有无"con.file",若无则在其子目录中查找
    find . -type f -exec ls -l {} ; 查找当前目录下是否有普通文件,若有则执行ls -l
    (4)xargs命令
    在 使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec。不幸的是,有些系统对能够传递给exec的命 令长度有限制,这样find命令运行几分钟之后就算出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs的用处所在,特别是与 find命令一起使用,exec会发起多个进程,而xargs会多个,只有一个
    find ./ -perm -7 -print | xargs chmod o-w 查找权限为7的文件并传递给chmod处理

    xargs

    通常Linux命令可以用|首尾相连,上一个命令的 stdout 连接到下一个命令的 stdin。但是有些命令,比如lsrm等,是从命令行参数接受输入的。这时候如果想把上一个命令的输出传给它们,就不好办了。所以就有了xargs

    find . -name "*.jpg" | xargs rm
    

    这样,所有被find找到的文件名,都会作为参数来调用rm命令了
    xargs默认以空白符分隔接受到的输入,所以一个含有空格的文件名会被当做多个参数,分别传给rm

    -print0

    所以在处理文件名这类命令时,通常要这样:

    find . -name "*.jpg" -print0 | xargs -0 rm
    

    这里的 -print0 是告诉find命令,在每个输出后面以'\0'作为结束。-0是告诉xargs,使用'\0'来分隔输入,而不是空白符。这样就避免出现问题了。

    find . -name "*.jpg" -print0 | xargs -0 -I {} mv {} {}.bak
    

    其中的-I {}是告诉xargs,后面的命令中,用{}表示占位符,将会被实际的参数替代。这样就行了。

    -print0 | xargs -0

    <font face="黑体" size=25 color=#0099ff> xargs 默认是以空白字符 (空格, TAB, 换行符) 来分割记录的, 因此文件名 ./file 1.log 被解释成了两个记录 ./file 和 1.log, 不幸的是 rm 找不到这两个文件.
    为了解决此类问题, 聪明的人想出了一个办法, 让 find 在打印出一个文件名之后接着输出一个 NULL 字符 ('') 而不是换行符, 然后再告诉 xargs 也用 NULL 字符来作为记录的分隔符. 这就是 find 的 -print0 和 xargs 的 -0 的来历吧.</font>

    常用命令

    //一般查找后 后续再继续操作
    //查找文件  -type表示查找类型
    find ./ -type f
    //查找目录
    find ./ -type d
    //查找名字为test的文件或目录     -name表示查找匹配的名字
    find ./ -name test
    

    摘录自:

    https://www.cnblogs.com/yorkyang/p/6294894.html
    https://www.cnblogs.com/sandea/p/6457921.html
    https://blog.csdn.net/qq_34685846/article/details/72825587

    相关文章

      网友评论

          本文标题:find

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