Linux find命令常见使用技巧

find是Linux中强大的文件查询命令,可以通过各种过滤条件查询想要的文件,还可以对查询结果执行进一步操作。本文对几个实用确容易误用的技巧进行介绍,完整的命令使用说明可通过info find查阅。
find命令的完整语法如下:

find [-H] [-L] [-P] [-Olevel] [-D debugopts] [path...] [expression]

  • path默认为当前目录
  • 默认的expression-print,即打印搜索结果。
日常使用中,用户主要通过控制 表达式 expression 部分参数来达成查询目的,表达式部分可以包含如下内容:
  1. 操作符:当有多个查询条件时,条件间的默认逻辑关系是 与 -and,逻辑关系可以是 与 -and、或 -or、非 -not和 括号 () 优先级。
  2. 常规选项:包括 查询深度-dept、查询当前挂载点 -mount-xdev 等。
  3. 测试表达式:查询的过滤条件,这是用户控制查询条件的主要部分,也是最复杂的部分,过滤方式包括文件属主、文件时间范围(访问、状态变化、修改时间)、文件权限、文件名称、文件类型等。
  4. 操作:对符合过滤条件的操作,包括删除 -delete、打印 -print-print0、执行命令 -exec等。
下面就操作符、权限过滤 -perm、执行命令 -exec的技巧进行说明。
1:操作符
  • 与:多个条件表达式间,默认是与操作,另外-a-and也表示与操作。示例:
    # 查询名称为abc开头,并且 非符合链接类对象 find . -name 'abc*' -not -type l find . -name 'abc*' -and -not -type l

  • 或:包括 -o-or。示例:
    # 查询名称为abc开头 或者 非符合链接类对象 find . -name 'abc*' -or -not -type l

  • 非:包括 !-not。示例:
    # 查询非符合链接类对象 find . -not -type l find . ! -type l

  • 优先级组合:优先级组合通过括号表示,不过需要在括号的前面加上\转义,并且括号的前后要有空格。示例:
    # 查询名称为abc开头, 类型为 符合链接 或 常规文件的对象 find . -name abc* -and \( -type l -or -type f \)

  • 两个条件并行:两个条件通过逗号隔开时,两个条件都会评估,但只有后一个条件返回true时,整个表达式才返回true。例如:EXPR1 , EXPR2
2:权限过滤 -perm
  • 对查询对象在Linux文件系统的权限进行过滤,过滤对象包括owne,group、other,过滤方式包括rwx或rwx的16进制,当以16进制过滤时,只有非0位才生效。示例:
    # 查询owner有写权限的对象 find . -perm o=w # 下面条件中,只有owner位生效,group和other为0,表示不过滤 find . -perm 200

  • -perm 的参数,除了上述没有前缀的方式,还可以包括 -/ 前缀。
    1. 无前缀:表示精确匹配, 如上述 -perm 200 表示只匹配owner权限为w的对象,不匹配owner包含rx权限的对象
    2. - 前缀:匹配模式中设置的 所有 bit都匹配成功的对象,对象可以包含其它的权限,示例:
      # 匹配owne 都 group有r权限的对象(owner和group用户还可以有其他权限) find . -perm -440 find . -perm -o=r,g=r find . -perm -o+r,g+r # 上面查询条件同价如下 find . -perm -o=r -and -perm -g=r find . -perm /o=r -and -perm /g=r

    3. / 前缀:匹配模式中设置的 任意 bit匹配成功的对象,对象可以包含其他权限,示例:
      # 匹配owne 或 group有r权限的对象(owner和group用户还可以有其他权限) find . -perm /440 find . -perm /o=r,g=r find . -perm /o+r,g+r # 上面查询条件同价如下 find . -perm -o=r -or -perm -g=r find . -perm /o=r -or -perm /g=r

3:执行命令 -exec
-exec等同于 -ok,表示对查询结果执行其他操作命令,find命令默认执行的命令为-print,即打印查询结果列表。
  • -exec中,通过 {} 占位符表示文件名在命令中出现的位置,最终命令执行时,{}会被替换为文件名。
  • -exec中,可以包括单文件命令和多文件命令。单文件命令会对每个查询结果执行一次,当命令以分号 ; 结尾时,表示但文件命令;多文件命令对所有结果一起执行,但命令以加号 + 结尾时,表示多文件命令。由于 +; 在shell中都是特殊字符,所有要通过斜杆进行转义,即写成 \+\;
    # 查询名称为abc开到的对象,并逐个删除。 find . -name 'abc*' -exec rm {} \; # 查询名称为abc开到的对象,并打包为一个压缩包。 find . -name 'abc*' -exec tar czvf target.gz {} \+

【Linux find命令常见使用技巧】参考:
  • 20 Advanced Linux Find Command Examples
  • 10 Linux Find Exec examples – Advanced Part
  • Linux / UNIX : Examples of find command to find files with specific sets of permissions
  • How To Find Files Based On their Permissions In Linux
  • Find Files Based On Their Permissions

    推荐阅读