1. find(1)
  2. find(1)

NAME

find - 递归地在层次目录中处理文件

总览

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

默认路径为当前目录,默认表达式为-print,-H,-L,-P选项决定如何对待符号 链接.

-P

不跟踪符号链接,默认选项.

-L

跟踪符号链接

-H

Do not follow symbolic links, except while processing the command line arguments.

-D

调试选项

-Olevel

开启搜索优化

描述

这个文档是GNU版本find命令的使用手册.

find搜索目录树上的每个文件,它从左至右运算给定的表达式,按照操作符优先顺序 规则进行匹配,直到得出结果(第一次在’与’操作中得出假,在’或’操作中得出真), 然后find移向下一个文件名.表达式可能由下列成份组成:操作符、选项、测试表达 式以及动作.表达式以第一个"-","()",或"!"字符起始的参数开始,它之前的任何参 数是要搜索的路径,它之后的任何参数都是表达式的余下部分.如果没有路径参数, 缺省用当前目录.如果没有表达式,缺省表达式用"-print".

当所有文件都成功处理时find退出并返回状态值0.如果发生错误则返回一个大于0 的值.

表达式

表达式是由选项、测试、动作组成,它们都以操作符分开.忽略操作符的时候,默认 使用"-and"连接.如果表达式没有包含"-prune"以外的动作,当表达式为真时会执行 "-print"动作.

选项

选项总是影响所有操作,而不仅仅是一个指定的文件的处理,而且总是返回真值.

位置选项

-daystart -follow -regextype

普通选项

-depth --help -maxdepth LEVELS -mindepth LEVELS -mount -noleaf
--version -xdev -ignore_readdir_race -noignore_readdir_race

操作符

以下操作符优先级递减,未做任何指定时默认使用"-and".

( EXPR ) !EXPR   -not EXPR   EXPR1 -a EXPR2   EXPR1 -and EXPR2
EXPR1 -o EXPR2   EXPR1 -or EXPR2   EXPR1 , EXPR2

测试

测试返回一个真值或一个假值.下式中"N"可以是"+N"或"-N"或"N".

-amin N -anewer FILE -atime N -cmin N
-cnewer 文件 -ctime N -empty -false -fstype 类型 -gid N 
-group 名称 -ilname 匹配模式 -iname 匹配模式 -inum N 
-ipath 匹配模式 -iregex 匹配模式
-links N -lname 匹配模式 -mmin N -mtime N -name 匹配模式 
-newer 文件 -nouser -nogroup -path 匹配模式 -perm [+-]访问模式 
-regex 匹配模式 -readable -writable -executable
-wholename PATTERN -size N[bcwkMG] -true -type [bcdpflsD] -uid N
-used N -user NAME -xtype [bcdpfls]

动作

-delete -print0 -printf FORMAT -fprintf FILE FORMAT -print 
-fprint0 FILE -fprint FILE -ls -fls FILE -prune -quit
-exec COMMAND ; -exec COMMAND {} + -ok COMMAND ;
-execdir COMMAND ; -execdir COMMAND {} + -okdir COMMAND ;

选项

所有的选项都总是返回真值,它们总会被执行,除非放在表达式中执行不到的地方 .因此,清楚起见,最好把它们放在表达式的开头部分.

-daystart

从当日起始时开始而不是从24小时之前,计算时间 (for-amin,-atime,-cmin,-ctime,-mmin,and-mtime).

-depth

先处理目录的内容再处理目录本身.

-follow

不检索符号链接.隐含了"-noleaf".

-help,--help

列出find的命令行用法的概要,然后退出.

-maxdepth levels

指定访问下层目录的最深层数

-maxdepth 0: 意味着只在命令行参数指定的目录中执行测试和动作.

-mindepth levels
不在"levels"层内执行任何测试和动作.

-mindepth 1: 意味着处理所有的文件,除了命令行参数指定的目录中的文件.

-mount

不进入处于其它文件系统之上的目录.可以用"-xdev"代替,从而和一些其 他版本的find兼容.

-noleaf

不为目录中子目录数量比硬连接数少二这种假设做优化.

这个选项在搜索那些不遵循UNIX文件系统链接约定的文件系统时用,比如 CD-ROM,MS-DOS文件系统或AFS卷的加载点.在普通的UNIX文件系统中,每个目录至 少有两个硬连接,它的名字和它的"."条目.另外,它的子目录(假如有)还会各有一 个".."链接到它.在find检索一个目录时,发现子目录数比它的连接数少二时,它 就知道目录中的其他条目并非目录(而是目录树中的叶(‘leaf’)节点).除非需要检 索的是这个叶节点,否则没必要去处理它.这样可以带来很大的搜索速度提升.

-version,--version

打印find的版本号然后退出.

-xdev

不进入处于其他文件系统之上的目录.

测试

数字参数可以这样给出:

+n

比n大

-n

比n小

n

正好是n

-amin n

对文件的最近一次访问是在n分钟之前.

-anewer file

对文件的最近一次访问比file修改时间要晚.如果命令行中"-follow"在 "-anewer"之前,也只有在这种情况下"-anewer"会受"-follow"的影响.

-atime n

对文件的最近一次访问是在n*24小时之前.

-cmin n

对文件状态的最近一次修改是在n分钟之前.

-cnewer file

对文件状态的最近一次修改比file修改时间要晚.如果命令行中"-follow" 在"-cnewer"之前,也只有在这种情况下"-cnewer"会受"-follow"的影响.

-ctime n

对文件状态的最近一次修改是在n*24小时之前.

-empty

文件是空的普通文件或者空目录.

-false

总是false.

-fstype type

文件处于type类型的文件系统之上.

有效的文件系统类型在不同版本的Unix中是不同的;一些Unix中的不完全的文件系 统类型列表是这样:ufs,4.2,4.3,nfs,tmp,mfs,S51K,S52K.你可以用"-printf"加 上%F指令来查看你的文件系统的类型.

-gid n

文件的数字形式的组ID是n.

-group name

文件属于name组(也允许使用数字形式的组ID).

-ilname pattern

和-lname类似,但是匹配时是不区分大小写的.

-iname pattern

和-name类似,但是匹配时不区分大小写.

-inum n

文件的i结点数是n.

-ipath pattern

-path类似,但是匹配时是不区分大小写的.

-iregex pattern

-regex类似,但是匹配时是不区分大小写的.

-links n

文件有n个链接.

-lname pattern

文件是一个与pattern匹配的符号链接.元字符不会对"/"或"."做特殊处理

-mmin n

对文件数据的最近一次修改是在n分钟之前.

-mtime n

对文件数据的最近一次修改是在n*24小时之前.

-name pattern

pattern可以是文件名和shell通配符,元字符"(*","?","[])"不会匹配文 件名开头的".".使用"-prune"略过一个目录及其中的文件.查看"-path"的 描述中的范例.

-newer file

对文件的最近一次修改比file修改时间要晚.如果在命令行中,"-follow" 在"-newer"之前,"-newer"会受"-follow"的影响.

-nouser

没有符合文件的数字形式的用户ID的用户.

-nogroup

没有符合文件的数字形式的组ID的组.

-path pattern

文件名与shell模式pattern相匹配.

元字符不会对"/"或"."做特殊处理.例如:

find . -path './sr*sc'

如果存在"./src/misc"的话,会将它打印出来.因此,想要忽略一个完整的目录树 ,应当使用"-prune"而不是检查目录树中所有的文件.例如要跳过"src/emacs"目 录和其中所有的文件和子目录,把其他找到的文件打印出来,应当这样:

find . -path'./src/emacs'-prune -o -print
-perm mode

文件的权限位恰好是mode(八进制或符号).

-perm -mode

所有的权限位mode都被设置了的文件.

-perm +mode

任何权限位mode被设置了的文件.

-regex pattern

文件名与正则表达式pattern匹配.这是对整个路径的匹配,不是搜索文件. 例如,要匹配名为"./fubar3"的文件,可以使用正则表达式".*bar."或者 ".*b.*3",但是不能用"b.*r3".

-size n[bckw]

文件使用n单位个存储单元.默认单位是512字节的块,也可以用"nb"来指定 这个值."nc"表示字节,"nk"表示千字节(kB),"nw"表示两字节的字,大小不 会计入"indirect blocks",但是会计入没有真正分配空间的疏松文件中的 块.

-true

总是true

-type c

文件是c类型的.类型可取值如下

b 特殊块文件(缓冲的)

c 特殊字符文件(不缓冲)

d 目录

p 命名管道(FIFO)

f 普通文件

l 符号链接

s 套接字

D 门(Solaris特有)

-uid n

文件的数字形式的用户ID是n.

-used n

文件最后一次存取是在最后一次修改它的状态的n天之后.

-user name

文件的所有者是name(也可以使用数字形式的用户ID).

-xtype c

和-type相同,除非文件是一个符号链接.对于符号链接:如果没有给出 "-follow",如果文件是一个指向c类型文件的链接,那么返回true;如果给 出了"-follow",如果c是‘l’那么返回true.换句话说,对于符号链接 ,-xtype检查那些-type不检查的文件.

动作ACTIONS

-exec command;
执行command

如果命令返回状态值0,那么exec返回true.所有find其余的命令行参数将作为提 供给命令的参数,直到遇到一个由‘;’组成的参数为止.命令的参数中,字符串‘{} ’将以正在处理的文件名替换.所有的‘{}’都会被替换,不仅是在单独的一个参数 中.有些版本的find不是这样做的.这些参数可能需要用‘\’来escape或者用括号 括住,防止它们被shell展开.命令是从起始目录执行的.

-fls file

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

-fprint file

返回true,将文件全名打印到文件file中.

如果运行find时file不存在,那么它将被创建.如果它存在,它将被覆盖.文件 /dev/stdout/dev/stderr会作特殊处理,它们分别指的是标准输出和标准错 误输出.

-fprint0 file

返回true,类似-print0但是像-fprint那样写入file.

-fprintf fileformat

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

-ok command;

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

-print

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

-print0

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

-printf format

返回true,在标准输出打印format.

字段宽度和精度可以像C函数printf那样来指定.与-print不同的是,-printf 在字符串末端不会添加一个新行.可用的转义字符和指令如下:

\a  警告铃声
\b  回退
\c  立即停止以当前格式输出,刷新输出设备.
\f  表格结束
\n  新行
\r  回车
\t  水平tab 
\v  竖直tab
\\  输出自身‘\’
\NNN    ASCII编码是NNN(八进制)的字符

\字符后面使用任何其他字符会被作为普通字符,因此它们都会被打印出来.

%%  输出自身‘%’
%a  文件最后一次存取的时间.格式是C函数‘ctime’返回值的格式.
%Ak     文件最后一次存取的时间.格式以k指定,可以是‘@’或者是C函
    数‘strftime’的指令格式.

下面列出了k可用的值,但并不是在所有系统上都可用,因为不同系统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..61)
T   24小时格式的时间(hh:mm:ss)
X   本地的时间表示方法(H:M:S)
Z   时区(例如EDT),如果不能决定时区就是空

日期字段:

a 本地一星期中每天的名称的缩写(Sun..Sat)
A 本地一星期中每天的全名,可变长度(Sunday..Saturday)
b 本地每月的名称的缩写(Jan..Dec)
B 本地每月的全名,可变长度(January..December)
c 本地的日期和时间表示(SatNov0412:02:33EST1989)
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.
-prune

如果没有给出-depth则返回true,不进入当前目录.如果给出了 -depth则返回false,没有效果.

-ls

返回true,以‘ls-dils’格式在标准输出列出文件.

块以1kB字节为单位计数,除非设置了环境变量POSIXLY_CORRECT,那样的话会使用 512字节的块.

操作符

以优先级高低顺序排列:

(expr)

强制为优先

!expr

如果expr是false则返回true

-not expr

!expr

expr1 expr2

与表达式,如果expr1为false则不会执行expr2

expr1 -a expr2

expr1 expr2

expr1 -and expr2

expr1 expr2

expr1 -o expr2

或表达式,如果expr1为true则不会执行expr2

expr1 -or expr2

expr1 -o expr2

expr1,expr2

列表,expr1和expr2都会被执行.expr1的值被忽略,列表的值 是expr2的值

实例

在/tmp中搜索文件名为core的普通文件,并将它删除

find /tmp −name core −type f −print | xargs /bin/rm −f

在manpages/中寻找以xargs开头的文件,并使用gvim打开

find manpages/ -name xargs* | xargs gvim

参见

locate(1L), locatedb(5L), updatedb(1L), xargs(1L)

Finding Files(Info在线帮助,或者是打印的版本)

  1. March 2015
  2. find(1)