Linux命令之find(一)

find [-H] [-L] [-P] [-Olevel] [-D help| tree| search| stat| rates| opt| exec] [路径] [表达式]

  find是查找文件的命令,与文件内容无关

  默认路径为当前目录;默认表达式为 –print

  表达式可能由下列成分组成:操作符、选项、测试表达式以及动作。

(一).选项

-H、-L、-P三个选项主要用来处理符号链接

-H 表示只跟随命令行中指定的符号链接

-L 表示跟随所有的符号链接

-P 是默认选项,表示不跟随符号链接

-O启用查询优化,后面紧跟一个数字(没有空格)。0等同于1;1默认优化级别,对应于传统的行为。表达式被重新排序,以便仅基于文件名(例如-name和-regex)的测试首先执行;2任何-type或-xtype测试都是在任何基于文件名的测试之后执行的,但在任何需要inode(索引节点)信息的测试之前执行;3在此优化级别,完整的基于成本的查询优化器已启用。测试的顺序被修改,以便首先执行便宜的(快速的)测试,并且如有需要稍后执行更昂贵的测试。

-D 用来显示调试信息。help解释调试(-D)选项;tree显示表达式树的原始和优化形态;search以详细的方式浏览目录树;stat使用stat和lstat系统调用来检查文件的打印信息,find程序试图将这种调用最小化;rates打印一个概要,表示每个predicate(谓词?)成功或失败的频率;opt打印与优化表达式树相关的诊断信息,请参阅-O选项;exec显示与-exec,-execdir,-ok和-okdir相关的诊断信息

(二).表达式

(1).操作符

优先级递减;未做任何指定时默认使用-and(EXPR=expression=表达式)

(EXPR) 括号优先级最高,首先对括号内的求值

! EXPR 对EXPR表达式的值取反

-not EXPR 同上,但是POSIX不支持

EXPR1 EXPR2 不加任何运算符,相当于两者之间加and,即与运算,两个表达式值都为true整个才true。先对expr1表达式求值,若为false,则不对expr2求值。

EXPR1 -a EXPR2 同上

EXPR1 -and EXPR2 同上,但是POSIX不支持

EXPR1 -o EXPR2 表示expr1和expr2两个表达式的值求或,左右两个值只要有一个true,整个表达式就是true。先对expr1表达式求值,若为true,则不对expr2求值。

EXPR1 –or EXPR2 同上,但是POSIX不支持

EXPR1,EXPR2 逗号表达式。expr1和expr2都会求值,但是只返回expr2的值,expr1的值会被丢弃。

(2).选项

位置选项

-daystart 从当日起始时,而不是从24小时之前,计算时间

-follow 不检索符号链接。隐含-noleaf,废弃参数,用-Linux代替

-regextype 设置正则表达式的类型,默认类型emacs,posix-awk、posix-basic、posix-egrep和posix-extended

普通选项

-depth 从指定目录下最深层的子目录开始查找

--help 帮助

-maxdepth <LEVELS(目录层级)>设置最大目录层级

-mindepth <LEVES(目录层级)>设置最小目录层级

-mount 在查找时不跨越文件系统的mount点(挂载点),与-xdev相同

-noleaf 不去考虑目录至少需要有两个硬链接存在

--version 显示版本信息

-xdev 不进入处于其他的文件系统的目录

-ignore_readdir_race 通常来讲统计一个文件时失败会抛出一个err,如果打开这个选项,则会屏蔽该错误信息

-noignore_readdir_race 关闭-ignore_readdir_race效果

(3).测试表达式

+N 是比N大

-N 是比N小

N 正好是N

以下所有N都代表上面的-N,+N和N

-admin <N(分钟)> 对文件的最近一次访问是在N分钟前

-anewer <FILE(参考文件)> 对参考文件的最近一次访问比file修改时间要晚。如果命令行中-follow在-anewer之前,(也只有在这种情况下)-anewer会受到-follow的影响

-atime <N(24小时数)> 对文件的最近一次访问是在N*24小时之前

-cmin <N(分钟)> 对文件状态的最近一次修改是在N分钟之前

-cnewer <FILE(参考文件)> 对参考文件状态的最近一次修改比File修改时间晚。如果命令行中-follow在-cnewer之前,(也只有在这种情况下)-cnewer会受到-follow的影响

-ctime <N(24小时数)> 对文件状态的最近一次修改是N*24小时

-empty文件是空的,可以是普通文件或目录

-false 总是false

-fstype <TYPE(文件系统类型)> 查找TYPE类型的文件系统中的文件。这些文件系统类型通常可以在/etc/fstab中找到,该配置文件中包含本系统中有关文件系统的信息。有效的文件系统类型在不同的版本的Unix中是不同的;一些Unix中不完全的文件系统类型列表是这样的:utf,4.2,4.3,nfs,tmp,mfs,S51K,S52K。你可以使用-printf加上%F来查看你的文件系统类型。

-gid <N(群组识别码)> 查找符合群组识别码的文件

-group <GNAME(群组名称)>查找符合群组名称的文件(允许组群识别码)

-ilname <PATTERN(范本样式)> 与-lname类似,但匹配时不区分大小写

-iname <PATTERN(范本样式)> 与-name类似,但匹配时不区分大小写

-inum <N(inode编号)> 查找符合指定的inode编号的文件

-ipath <PATTERN(范本样式)> 与-path类似,但匹配时不区分大小写。(与-iwholename相同,提示部分系统提示已弃用)

-iregex <PATTERN(范本样式)> 与-regex类似,但匹配时不区分大小写

-iwholename <PATTERN(范本样式)> 与-wholename类似,但不区分大小写

-links <N(连接数目)> 查找符合指定N个硬链接的文件

-lname <PATTERN(范本样式)> 指定PATTERN字符串为查找符号链接的范本样式,元字符不会对’/’和’.’做处理

-mmin <N(分钟)> 文件数据的最后一次修改时间在N分钟之前

-mtime <N(24小时数)> 文件数据的最后一次修改在N*24小时之前

-name <PATTERN(范本样式)> 按照文件名查找文件。指定PATTERN字符串为查找文件的范本样式,元字符’*?[]’不会匹配文件名的开头。使用-prune来略过一个目录及其中的文件。查看-path的描述中的范例

-newer <FILE(参考文件或目录)>对文件的最后一次修改比FILE修改时间要晚。如果命令行中-follow在-newer之前,(也只有在这种情况下)-newer会受到-follow的影响

-nouser 找出不属于本地主机用户识别码的文件

-nogroup 找出不属于本地主机群组识别码的文件

-path <PATTERN(范本样式)> 指定PATTERN字符串为查找文件的范本样式,元字符不会对’/’和’.’做处理

-perm [ +-]MODE 按照文件权限来查找文件。查找指定权限数值(或符号)的文件。MODE是刚好满足权限不多不少;-MODE是设置的权限必须满足,没有设置的权限可以有,可以没有;+MODE是三类用户分别拥有的三种权限,只要满足其中任意一个用户得任意一个权限即可(部分满足),没有设置的权限可以有,可以没有。+MODE和之后的/MODE相同

-regex <PATTERN(范本样式)> 指定PATTERN字符串为查找文件的范本样式,是路径上的匹配。

-readable 匹配可读的文件

-writable匹配可写的文件

-executable 匹配可执行的文件

-wholename <PATTERN(范本样式)> 参见-path

-size N[ bcwkMG] 查找指定文件大小的文件,1字节c,2字节w,块(512字节)b千字节k,兆字节M,吉字节G。

-true 总是true

-type [ bcdpflsD] 根据文件类型进行搜索。f普通文件,l符号链接,d目录,c字符设备,b块设备,s套接字,p命名管道(FIFO),D(Solaris持有)

-uid <N(用户识别码)> 查找符合指定用户识别码的文件

-used <N(天数)> 查找文件最后一次存取是最后一次修改的N天后

-user <UNAME(拥有者名称)> 查找符合指定拥有者名称的文件

-xtype [ bcdpfls] 与-type类似,只不过它针对的是符号链接

-context CONTEXT 安全的文件上下文匹配模式(只限SELinux)

(4).动作

-delete 删除,成功返回true,失败返回err信息。如果删除失败,find最终退出码非0,使用-delete自动打开-depth选项

-exec COMMAND ;  执行COMMAND。查找到的所有结果将被作为参数提供给命令,直到遇到一个有';'组成的参数为止。命令的参数中,字符串'{}'将以正在处理的文件名替换。所有的'{}'都会被替换,不仅是在单独的一个参数中。有些版本的find不是这样做的。这些参数可能需要用'\'来转义或用括号括住,防止被展开。命令是从起始目录开始执行的。

(注意:一般使用方法是-exec COMMAND {} \;)

-exec COMMAND {} +  是-exec动作执行的一个变体,为选定的文件执行指定的命令,但是命令行是通过在末尾添加每个选定的文件名来构建的。调用命令的总数将远少于匹配文件的数量。命令行的构建方式与xargs构建它命令行的方式大致相同。命令里只允许有一个"{}"的实例。该命令从起始目录执行的。

-execdir COMMAND ;  与-exec类似,但指定的命令从子目录开始执行,包括匹配的文件

-execdir COMMAND {} +  与-exec类似,但指定的命令从子目录开始执行,包括匹配的文件

-fls FILE 返回true;类似-ls但是像-fprint那样写入file

-fprint FILE返回true;将文件全名打印到文件file中。如果运行find时file不存在,那么它将被创建。如果它存在,它将被覆盖。文件名'/dev/stdout'和'/dev/stderr'会作特殊处理;它们分别指的是标准输出和标准错误输出。输出文件总是会被创建。

-fprint0 FILE 返回true;类似-print0但是像-fprint那样写入file

-fprintf FILE FORMAT 返回true;类似-printf但是像-fprint那样写入file

-ls 返回true在标准输出中列出'ls -dils'查看的文件

-ok COMMAND ;  类似-exec但是会先向用户询问(在标准输出);如果回应不是以'y'或'Y'起始则不会运行COMMAND而是返回false;

-okdir COMMAND  类似-ok但是从子目录开始执行 

-print 返回true;在标准输出打印文件全名,然后一个换行符

-print0 返回true;在标准输出打印文件全名,然后一个null字符。这样可以使得处理find的输出的程序可以正确地理解带有换行符的文件名。

-printf FORMAT 返回true;在标准输出打印FORMAT,解释'\'转义和'%'指令。字段宽度和精度可以像C函数'printf'那样来指定。与-print不同的是,-printf在字符串末端不会添加一个新行。(转义和指令请看第五大项)

-prune 如果没有给出-depth则返回true,不进入当前目录(排除当前目录)。如果给出-depth则返回false,没有效果。

-quit 立即退出。没有任何子进程将保持运行,但不会处理命令行中指定的更多路径

(5).转义及指令

\a 警告铃声

\b 回退

\c 立即停止以当前格式输出,刷新输出设备

\f 表格结束

\n 新行

\r 回车

\t 水平tab

\v 竖直tab

\\ 输出自身'\'

\NNN ASCII编码是NNN(八进制)的字符

%% 输出自身'%'

%a 文件最后一次存取的时间。格式是C函数'ctime'返回值的格式。

%Ak 文件最后一次存取的时间。格式以k指定,可是'@'或者是C函数'strftime'的指令格式。下面列出可用值,有些不是在所有系统上都可用。

                      H 小时 (00..23)
                      I 小时(01..12)
                      k 小时 ( 0..23)
                      l 小时 ( 1..12)
                      M 分钟 (00..59)
                      p 地区上午(AM)或下午(PM)
                      r 时间,12小时制(hh:mm:ss [AP]M)
                      S 秒(00.00 .. 61.00)。有一个小数部分。
                      T 时间, 24小时制 (hh:mm:ss)
                      + 日期和时间,以'+'分隔,例如'2004-04-28 + 22:22:05.0'。这是一个GNUplot扩展。时间在当前时区中给出(可能受设置TZ环境变量的影响)。秒字段包含小数部分
                      X 语言环境的时间表示(H:M:S)
                      Z 时区(例如EDT),或者如果没有时区是可确定的,则为空
                     Date fields:
                      a 地区缩写工作日名称(Sun..Sat)
                      A 地区完整工作日名称,可变长度(Sunday..Saturday)
                      b 地区缩写月份名称(Jan..Dec)
                      B 地区完整月份名称,可变长度(January..December)
                      c 地区的日期和时间(Sat Nov 04 12:02:33 EST 1989).格式与(3)相同,因此为了保持与该格式的兼容性,秒字段中没有小数部分
                      d 月内第几天(01..31)
                      D 日期(mm/dd/yy)
                      h 和b相同
                      j 年内第几天 (001..366)
                      m 月(01..12)
                      U 月内第几周,星期日为一周的第一天(00..53)
                      w 星期几 (0..6)
                      W 年内第几周,周一为一周的第一天(00..53)
                      x 语言环境的日期表示(mm/dd/yy)
                      y 年份的后两位数字(00..99)
                      Y 年(1970...)

%b 文件大小以512字节块为单位(四舍五入)

%c 文件状态最后一次修改时间。格式是C函数'ctime'返回值的格式

%Ck 文件状态最后一次修改时间。格式以k指定,类似%A

%d 文件在目录树中的深度;0表示文件是一个命令行参数

%f 去掉前面的目录的文件名(只剩下最后的成分)

%F 文件所在文件系统的类型;这个值可以为-fstype所用。

%g 文件的组名,如果组没有名称就是数字形式的组ID。

%G 文件的数字形式的组ID

%h 文件名的前面的目录部分(仅去除最后的成分)

%H 根据已找到的文件的命令行参数

%i 文件的i节点号(16进制)

%k 文件大小以1KB为单位(四舍五入)

%l 符号链接的目标(如果文件不是一个符号链接,那么结果是空字符串)

%m 文件的权限位(8进制)

%n 文件的硬链接数

%p 文件名

%P 文件名,去掉根据已找到的文件的命令行参数的名称部分

%s 文件大小,以字节为单位

%t 文件最后一次修改时间,格式是C函数'ctime'返回值的格式

%Tk 文件的最后一次修改时间。格式以k指定,类似%A

%u 文件的用户名,如果用户没有名称就是数字形式的用户ID

%U 文件的数字形式的用户ID

 

下一篇Linux命令之find(二)

posted @ 2018-05-30 16:38  苦逼运维  阅读(2225)  评论(0编辑  收藏  举报