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