强大的find命令

作为一个命令行重度用户,强大的命令行搜索功能是必不可少的。这里介绍一下系统自带的find命令,最近结合fzf使用感觉棒棒哒。

find

find的用法如下:

$ find []  []

是一些可选的配置,具体参见文档。
是搜索的范围,可以有多个目录。
是表达式,可以有多个,下面具体说说这些表达式。

每一个表达式都可以由一些条件一个操作组成,每个条件都有一个返回值,通过逻辑运算符连接,如果省略逻辑运算符,则相当于AND运算。

一些常用的条件:

  • -type:限定搜索对象的类型
    • -type f:普通文件
    • -type d:目录
  • -name-iname:匹配项目名字,-iname不区分大小写
    • -name hello:完全匹配
    • -name *hello*:使用通配符
  • -path-ipath: 匹配项目绝对路径,-ipath不区分大小写
    • -path /home/gerald/file:完全匹配
    • -path *hello*:使用通配符
  • -prune:剪枝
    参考 Stack Overflow。
    这个操作使find不再搜索匹配到的文件夹的内容,起到剪枝的作用。始终返回true,因此如果使用OR运算,后续表达式将不再执行,就起到了过滤匹配到的项目的作用。

一些常用的操作:

  • -print:将结果输出到stdout,返回true
    如果没有指定操作,则默认使用-print

一些栗子:

  • 列出当前目录下所有文件
    $ find . -type f
    $ find . -type f -print
    
  • 匹配文件名字
    $ find . -type f -name foobar
    $ find . -type f -name foobar -print
    
  • 剪枝
    $ find . -name foobar -prune
    $ find . -name foobar -prune -print
    
    匹配名字是foobar的项目,如果是文件夹,则不再继续搜索子文件夹。
  • 过滤
    $ find . -name foobar -prune -o -print
    
    匹配名字是foobar的项目,由于有OR操作,匹配结果将被丢弃,不匹配的结果继续执行,因此最终得到的是名字不为foobar的项目。
    $ find . -name foobar -prune -o -name foo* -print
    
    在剩下的结果中匹配foo开头的项目。如果省略-print,则相当于最外层应用-print,如下:
    $ find . \( -name foobar -prune -o -name foo* \) -print
    
    这时名字是foobar的项目也会包括进去,只是剪枝依然有效。

你可能感兴趣的:(强大的find命令)