find命令用于在指定目录中根据tests测试条件搜索符合tests测试条件的文件

概要

该命令的形式如下:

[-H

第一次看到该命令的人可能会被其复杂繁多的选项参数吓到。其实在日常开发中,很多选项并不多见。所以上述命令格式可以简化如下:

[path...

Path

即为查找文件的路径,命令将在指定目录及其子目录下进行查找文件,默认为当前路径

Expression

表达式,由option选项、test测试条件、action动作组成。option选项,均返回true。test测试条件即为当前文件的判定条件,其返回true/false;action动作是作用于当前文件的动作,其同样返回true/false。

如果在表达式中除了-prune外无其他action。则默认对整个表达式结果为true的文件执行 -print 动作,而不是直接在后面添加-print。 示例如下:

操作符

通常在表达式会包含多个option、test、action,如下代码 code 1 处所示。当未显式指定操作符时,默认为 "-a" (即AND)操作符,故其命令的完整形式为code 2处所示

'./subTest' -iname 

常用操作符如下:

  • expr1 -a expr2 : AND 逻辑与,使用短路求值。亦可写为expr1 -a expr2。如果 expr1 结果为 false,expr2 将不会被执行
  • expr1 -o expr2 : OR 逻辑或,使用短路求值。如果 expr1 结果为 true,expr2 将不会被执行
  • ( expr ) : 由于 AND 逻辑与的优先级 高于 OR 逻辑或的优先级。故,可以通过添加括号改变默认的操作符优先级。需要注意的是,命令中的左右括号需要使用反斜杠进行转义。即,( expr )
  • ! expr : NOT 逻辑非。对expr的结果进行取反

示例如下:

Tests 测试条件

在日常开发中,tests 测试条件最为常用,现对常用的测试筛选项进行介绍:

根据文件名查找文件

根据文件名来查找文件,这也是日常最常用的:

# 大小写敏感
-iname <filename>   

其中,文件名参数可以使用Linux的文件名通配符,注意其不是正则

根据文件权限

根据文件(Linux下,目录也属于文件)权限来筛选文件,其有3种匹配模式

# 严格匹配所给权限-perm -num      

  • 严格匹配

其将严格匹配所给权限的0和1设置,即结果文件的权限码必须和给定权限码num完全一致

-perm num

  • 满足所给全部权限位即可

对于给定权限码num,文件全部满足给定的权限位即可,对于多余的权限位并不敏感

-perm -num

  • 满足所给任一权限位即可

对于给定权限码num,文件若存在任一一个满足给定的权限位即可,对于多余的权限位并不敏感

-perm /num

排除某个目录

查找文件时,如果已经知道某个目录下不存在我们所需文件,可以在find中指定排除,以免浪费时间搜索。下述命令中的-path test条件用来判定是否存在指定路径。如果是,则其返回true,并根据逻辑与的短路求值策略继续执行-prune action动作,用于排除该路径

    -path pathName -prune-path pathName -a -prune

  • 示例1

1处查看检索当前目录下所有的内容,而2处则是查看除subTest目录外的文件

相信这里会让人疑惑的地方在于 -print 前面的 -o 或操作符,根据前文所述,-path ./subTest -a -prune 用于排除指定目录,然后-print是查看剩下的文件,中间应该是用 -a 与操作符来连接啊。好,那我们先将上面代码中的 -o -print 改为 -a -print。来看看会发生什么

咦?这里竟然输出的结果是不是让人很吃惊…………竟然是我们需要排除的目录。其实,问题是在于我们没有理清find命令的执行逻辑,find是对path下的所有文件(目录文件夹也是文件的一种)依次去执行表达式,根据test条件的结果来判定是否执行action。对于本例而言,当对subTest目录进行判定时,-path ./subTest 测试条件结果肯定为true,然后执行-prune以不对该目录下的文件进行遍历搜索测试,其是一个action且结果恒为真。如果此时后面如果是-a -print,则对当前测试的文件(即,subTest目录)执行打印动作,而遍历其他文件(比如,bers文件)进行测试时,-path ./subTest 测试条件结果为false,根据短路求值策略,均不会执行 -prune动作和-print动作,故最终我们看到的输出结果,只有./subTest目录文件;同理,如果后面是-o -print的话,测试 ./subTest 目录文件时,-path ./subTest -prune 结果为true,由于后面是-o 与操作符,根据短路求值策略,其将不会执行-print动作,而遍历其他文件(比如,bers文件)进行测试时,-path ./subTest 测试条件结果为false,根据短路求值策略,其将不会执行-prune动作,且 -path ./subTest -prune结果为false。而对于-print动作而言,由于其前面为 -o 或操作符,将会执行-print动作,即打印当前测试文件(比如,bers文件)

  • 示例2

按名查找并排除指定目录

-a、-o 优先级

如前文所述,-a 与操作符优先级高于 -o 或操作符优先级。所以如果不注意这点,很容易会产生Bug。例如,我们期望找到名为 bers 或 numbers.txt 文件,代码如下:

从上文执行的结果,可以看到没有成功查找出bers文件,原因很简单,由于 -a 优先级比 -o 高,-print 动作只会在-iname 'numbers.txt' 测试条件返回true时执行。所以上述命令等价于下图所示

同理,即使将numbers.txt换为一个不存在的文件名 abc ,也同样不会输出存在的bers文件

所以,对于该问题,需要通过添加括号来改变操作符的默认优先级,使其满足我们的需求

find 命令_Linux下查找文件:find 命令相关推荐

  1. linux下查找文件的命令

    查命令绝对路径: which用于查找并显示给定命令的绝对路径,环境变量中PATH参数也可以被查出来. [root@localhost ~]# which bash /usr/bin/bash[root ...

  2. linux下打开配置文件命令_Linux下用户权限相关命令

    09.Linux下用户权限相关命令 用户权限的基本概念: 用户 是Linux 系统工作中重要的一环,用户管理包括 用户 与 组 管理 在Linux系统中,不论是由本机或是远程登陆系统,每个系统都必须拥 ...

  3. 列出历史命令_Linux 下如何使用 fc 命令

    使用Linux的过程中,在处理很长的并且包含复杂的语法的命令时,如果不小心范了一点小错误,需要重新输入整个命令以及参数,直到命令执行成功为止.另一种选择是使用 fc 命令编辑并重新运行前一个命令,而无 ...

  4. oracle 查看监听命令_linux下使用Oracle常用命令

    进入Oracle用户 1 su - oracle 以dba身份进入sql语句 1 sqlplus / as sysdba 启动数据库相关命令 启动数据库 1 startup 启动监听(关闭监听的命令l ...

  5. java sftp命令_linux下如何使用sftp命令

    from:   http://www.cnblogs.com/chen1987lei/archive/2010/11/26/1888391.html 36351 sftp 是一个交互式文件传输程式.它 ...

  6. linux 查找文件夹命令_如何从命令行在Linux中查找文件,文件夹和目录?

    linux 查找文件夹命令 Linux provides different ways to find and locate files and folders. We can use GUI too ...

  7. linux查找文件夹命令详解

    Linux find命令用来在指定目录下查找文件.任何位于参数之前的字符串都将被视为欲查找的目录名.如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件.并且将查找到的子目录 ...

  8. linux查找文件夹命令_如何在Linux中使用命令行查找文件和文件夹

    linux查找文件夹命令 Most people use a graphical file manager to find files in Linux, such as Nautilus in Gn ...

  9. del rd命令行下删除文件不需要确认

    del rd命令行下删除文件不需要确认发布:dxy 字体:[增加 减小] 类型:转载  - del命令参数说明  /F 强制删除只读文件.  /S 从所有子目录删除指定文件.  /Q 安静模式.删除全 ...

最新文章

  1. 2022-2028年中国再生塑料颗粒行业市场全景调查及发展趋势分析报告
  2. 《深入理解C++11:C++ 11新特性解析与应用》——2.4 宏__cplusplus
  3. 关键词与关键词之间的相关度计算
  4. 配置Quartz.net Cluster以及远程管理
  5. 苹果如果无法弹出⏏️
  6. js获取数组最大值的索引_数组中最大值的返回索引
  7. linux内核模块间通信
  8. Bootstrap开篇理解:
  9. Hibernate之Session merge与update方法
  10. proxool,好东西
  11. 1007 素数对猜想 (20 分)—PAT (Basic Level) Practice (中文)
  12. 如何建立能力评估模型?
  13. 【mcuclub】温度传感器DS18B20
  14. ae合成设置快捷键_ae技巧,使用ae实用小技巧
  15. wpf之pdf的显示
  16. 手机卸载不了刷机精灵
  17. html标签 lt heavy gt,HTML Purifier:转换&lt; body&gt;到&lt; div&gt;
  18. Android桥方法设置GPS信号,android-GPS更新间隔更快,信号良好?
  19. CSS复合选择器:后代选择器
  20. python外星人实验报告_Python 项目实践一(外星人入侵)第一篇

热门文章

  1. 脚本运行显示服务器超时,java执行shell脚本超时
  2. python中输入17=x会引起错误_python新手常犯的17个错误
  3. 计算机科学与教育信息化国际会议,A Courses Ontology System for Computer Science Education...
  4. java fx listview,JavaFX 8自定义ListView单元它是邪恶的
  5. java xml获取属性值_java – 如何获取具体属性值的特定XML元素?
  6. Mybatis源码分析--Mapper接口的代理生成原理
  7. java bean 对象属性复制框架BeanMapping-release_0.0.2-注解支持
  8. presto spill to disk
  9. 智能算法的研究与实现
  10. mysql create routine 权限的一些说明