使用Linux和Unix命令:find

LinuxUnix命令find查找目录层次结构中的文件。

find命令的语法:

找到[path ...] [expression]

描述

本手册页记录了GNU版本的find 。 根据优先级规则(请参见下面的运算符一节),通过评估给定表达式,从左到右评估给定表达式,直到结果已知;命令find查找以每个给定文件名为根的目录树; 换句话说,左边是虚假的操作,真正的, 或者 ,在这一点上找到移动到下一个文件名。

第一个参数开始于:

被认为是表达的开始; 它之前的任何参数都是搜索的路径,其后的任何参数都是表达式的其余部分。 如果没有给出路径,则使用当前目录。 如果没有给出表达式,则使用表达式-print

如果所有文件都成功处理,则find命令将退出状态0,如果发生错误,则该命令将大于0。

表达式

表达式由选项(影响整体操作而不是特定文件的处理,总是返回true),测试(返回true或false值)和动作(具有副作用并返回true或虚假值),全部由运营商分隔。 表达式-并假定在省略操作符的地方。 如果表达式不包含除-prune之外的其他操作,则在所有表达式为true的文件上执行-print

选项

所有选项总是返回true。 它们总是起作用,而不是只有在达到表达式的位置时才被处理。 因此,为了清楚起见,最好将它们放在表达式的开头。

-daystart 从今天开始测量时间(对于-amin,-atime,-cmin,-ctime,-mmin-mtime ),而不是从24小时前开始。
-深度 在目录本身之前处理每个目录的内容。
-跟随 取消引用符号链接。 意味着-noleaf
帮助或 - 帮助 打印查找和退出命令行使用情况的摘要。
-maxdepth [数字] 在命令行参数下面的目录下降最多级别(非负整数)。 表达式-maxdepth 0表示仅将测试和操作应用于命令行参数。
-mindepth [数字] 不要在小于数字的级别上应用任何测试或操作(非负整数)。 表达式-mindepth 1表示处理除命令行参数以外的所有文件。
-安装 不要下载其他文件系统上的目录。 -xdev的替代名称,用于与某些其他版本的查找兼容。
-noleaf 不要通过假设目录包含少于2个子目录来优化它们的硬链接数。*
- 版本或 - 版本 打印查找版本号并退出。
-xdev 不要下载其他文件系统上的目录。

*在搜索不遵循Unix目录链接约定的文件系统时需要此选项,例如CD-ROM或MS-DOS文件系统或AFS卷装入点。 普通Unix文件系统上的每个目录至少有2个硬链接:它的名字和它的名字 (期间)条目。 另外,它的子目录(如果有的话)每个都有一个链接到该目录的..条目。

find检查一个目录时,在目录的链接数量减少了两个以下的子目录之后,它知道该目录中的其余条目是非目录(目录树中的文件)。 如果只需要检查文件的名称,则不需要对它们进行统计; 这会显着提高搜索速度。

测试

数字参数可以指定为:

+ N 对于大于n。
-n 少于n。
ñ 正好n。
-amin n 文件上次访问时间为n分钟前。
-anewer [文件] 最近访问的文件文件被修改的时间更晚。 -anewer只有在以下情况下才会受到影响 - 关注之前 - 在命令行上执行。
-atime n 文件上次访问n * 24小时前。
-cmin n 文件的状态在n分钟前最后更改。
-cnewer [文件] 文件的状态最近更改的时间比文件被修改的时间更晚。
- cnewer仅受以下影响 - 如果以下情况发生在命令行上的-cnewer之前。
时间 文件的状态在n * 24小时前最后更改。
-empty 文件是空的,可以是普通文件或目录。
-假 总是假的。
-fstype [类型] 文件位于指定类型的文件系统上。 有效的文件系统类型在不同版本的Unix中有所不同; 在某些版本的Unix或另一版本上接受的不完整的文件系统类型列表是:ufs,4.2,4.3,nfs,tmp,mfs,S51K,S52K。 您可以使用带有%F指令的-printf来查看文件系统的类型。
-gid n 文件的数字组ID是n
-group [gname] 文件属于组gname(允许的数字组ID)。
-ilname [pattern] 和-lname一样,但匹配不区分大小写。
-iname [模式] 名字一样,但匹配不区分大小写。 例如,模式fo *F? 匹配文件名称FooFOOfoofOo等。
-inum n 文件具有inode编号n
-ipath [模式] -path ,但匹配不区分大小写。
-iregex [模式] 像-regex一样,但匹配不区分大小写。
链接 文件有n个链接。
-lname [模式] 文件是其内容与shell模式匹配的符号链接。 元字符不处理/ 特别。
-mmin n 文件数据是在n分钟前最后修改的。
-mtime n 文件数据最近在n * 24小时前进行了修改。
-name [pattern] 文件名称的基础(删除主导目录的路径)与shell模式匹配。 元字符( * ,?和[] )与a不匹配 在基地名称的开始处。 要忽略目录及其下的文件,请使用-prune ; 请参阅-path的描述中的示例。
- 更新[文件] 文件比文件更新 。 表达式-newer受以下影响 -只有在命令行中的“之后” 出现在“之前”时才会跟随
-nouser 没有用户对应于文件的数字用户ID。
-nogroup 没有组对应于文件的数字组ID。
-path [pattern] 文件名与shell模式匹配。 元字符不处理/ 特别; 所以,例如,找到。 -path'./sr*sc将打印一个名为./src/misc(如果存在)的目录条目。 要忽略整个目录树,请使用-prune而不是检查树中的每个文件。 例如,要跳过目录src / emacs及其下的所有文件和目录,并打印找到的其他文件的名称,请执行以下操作:find。 -path'./src/emacs'-prune -o -print
-perm [模式] 文件的权限位完全是[模式] (八进制或符号)。 符号模式使用模式0作为出发点。
-perm -mode 所有权限位[模式]均为该文件设置。
-perm +模式 为该文件设置任何权限位[mode]
-regex [模式] 文件名称匹配正则表达式模式 。 这是整个路径上的匹配,而不是搜索。 例如,要匹配名为./fubar3的文件,可以使用正则表达式。* bar。。* b。* 3 ,但不是b。* r3
-size n [bckw] 文件使用n个单位的空间。 默认情况下,这些单元是512字节块,或者如果b遵循n ,则字节如果c遵循n ,则如果k遵循n ,则为千字节;如果w遵循n,则为2字节字。 大小不计算间接块,但它确实计算实际未分配的稀疏文件中的块。
-真正 总是如此。
型c 文件是c类型的:
b 块(缓冲)特殊
C 字符(无缓冲)特殊
d 目录
p 命名管道(FIFO)
F 普通文件
符号链接
小号 插座
d 门(Solaris)
-uid n 文件的数字用户ID是n
用过的 文件上次更改状态后最近一次访问。
用户uname 文件由用户uname拥有(允许使用数字用户ID)。
-xtype c -type相同,除非该文件是符号链接。 对于符号链接:如果没有给出-follow ,则如果该文件是指向类型为c的文件的链接,则为true; 如果已经给出 - 如果c是1,则返回true。 换句话说,对于符号链接,
-xtype检查-type不检查的文件的类型

操作

-exec 命令 ;

执行命令 ; 如果返回0状态,则返回true。 以下所有找到的参数都被认为是该命令的参数,直到由“;”组成的参数 遇到。 在某些版本的find中 ,字符串“{}”被替换为当前文件名,该文件名在处理它的命令的参数中进行处理,而不仅仅是单独存在的参数。 这两个构造都可能需要被转义(用'\')或引号来保护它们免受shell的扩展。 该命令在起始目录中执行。

-fls 文件

真正; 像-ls,但写入文件如-fprint。

-fprint 文件

真正; 将完整的文件名打印到文件文件中 。 如果运行查找文件不存在,则会创建它; 如果它确实存在,它将被截断。 文件名“/ dev / stdout”和“/ dev / stderr”是专门处理的; 它们分别指标准输出和标准错误输出。

-fprint0 文件

真正; 像-print0但写入文件如-fprint。

-fprintf 文件 格式

真正; 像-printf,但写入文件如-fprint。

-ok 命令 ;

像-exec一样,但首先询问用户(在标准输入上); 如果响应不是以“y”或“Y”开始,请不要运行该命令,并返回false。

-打印

真正; 在标准输出上打印完整的文件名,然后换行。

-print0

真正; 在标准输出上打印完整文件名,后跟一个空字符。 这允许包含换行符的文件名由处理查找输出的程序正确解释。

-printf 格式

真正; 在标准输出上打印格式 ,解释'\'转义和'%'指令。 字段宽度和精度可以用`printf'C函数来指定。 与-print不同,-printf不会在字符串的末尾添加换行符。 逃逸和指示是:

\一个

警钟。

\ b

Backspace键。

\C

立即停止从此格式进行打印并清空输出。

\F

换页。

\ n

新队。

\ r

回车。

\ t

水平标签。

符\ v

垂直选项卡。

\\

一个文字反斜杠('\')。

\ NNN

ASCII码为NNN(八进制)的字符。

一个'\'字符后跟任何其他字符被视为普通字符,因此它们都被打印出来。

%%

字面百分号。

%一个

文件的上次访问时间采用C`ctime'函数返回的格式。

%A k

文件的上次访问时间,格式为k ,既可以是`@',也可以是C`strftime'函数的指令。 下面列出了k的可能值。 由于系统之间`strftime'的差异,其中一些可能不适用于所有系统。

@

自1970年1月1日00:00 GMT以来的秒数。

时间字段:

H

小时(00..23)

一世

小时(01..12)

ķ

小时(0..23)

小时(1..12)

中号

分钟(00..59)

p

现场的AM或PM

[R

时间,12小时(hh:mm:ss [AP] M)

小号

第二(00..61)

Ť

时间,24小时(hh:mm:ss)

X

区域设置的时间表示(H:M:S)

ž

时区(例如EDT),或者如果没有时区是可确定的,则什么都不是

日期字段:

一个

locale的缩写周日名称(Sun..Sat)

一个

语言环境的完整星期几名称,可变长度(星期日..星期二)

b

locale的缩写月份名称(Jan..Dec)

区域设置的全月名称,可变长度(1月... 12月)

C

语言环境的日期和时间(Sat Nov 04 12:02:33 EST 1989)

d

(01..31)

d

日期(年/月/日)

H

与b相同

Ĵ

(001..366)

月(01..12)

ü

星期日的星期数作为星期的第一天(00..53)

w ^

星期几(0..6)

w ^

周一到周的第一天(00..53)

X

区域设置的日期表示(mm / dd / yy)

ÿ

年份的后两位数字(00..99)

ÿ

年(1970 ...)

%b

文件大小为512字节块(向上舍入)。

%C

文件的最后状态以C`ctime'函数返回的格式更改时间。

%C k

文件的上一次状态更改时间的格式为k ,与%A相同。

%d

文件在目录树中的深度; 0表示该文件是命令行参数。

%F

删除任何主要目录的文件名(仅限最后一个元素)。

%F

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

%G

文件的组名称或数字组ID,如果该组没有名称。

%G

文件的数字组ID。

%H

文件名的前导目录(除最后一个元素外)。

%H

在其下找到文件的命令行参数。

%一世

文件的inode编号(十进制)。

%K

文件大小为1K块(向上取整)。

%L

符号链接对象(如果文件不是符号链接,则为空字符串)。

%M

文件的权限位(八进制)。

%N

硬链接到文件的数量。

%p

文件的名称。

%P

文件的名称与命令行参数的名称一起被删除。

%S

文件大小以字节为单位。

%T

文件的最后修改时间采用C`ctime'函数返回的格式。

%T k

文件的上次修改时间的格式为k ,与%A相同。

%u

文件的用户名或数字用户标识(如果用户没有名称)。

%U

文件的数字用户ID。

一个'%'字符后跟任何其他字符将被丢弃(但另一个字符被打印)。

-修剪

如果没有给出深度,则为真; 不要下载当前目录。
如果给出了-depth,则为false; 没有效果。

-ls

真正; 在标准输出上以`ls -dils'格式列出当前文件。 块计数为1K块,除非设置了环境变量POSIXLY_CORRECT,在这种情况下使用512字节的块。

运营商

按递减优先顺序列出:

expr

强制优先。

EXPR

如果expr为false,则为true。

不是expr

与...一样 ! expr

expr1 expr2

和(暗示); 如果expr1为假,则不评估expr2

expr1 -a expr2

expr1 expr2相同。

expr1expr2

expr1 expr2相同。

expr1 -o expr2

要么; 如果expr1为true,则不评估expr2

expr1 - 或expr2

expr1 -o expr2相同。

expr1expr2

清单; 总是评估expr1expr2expr1的值被丢弃; 列表的值是expr2的值。

例子

找到/ home -user joe

找到用户joe拥有的/ home目录下的每个文件。

找到/ usr -name * stat

在以“.stat”结尾的/ usr目录下查找每个文件。

找到/ var / spool -mtime +60

找到60天前修改的/ var / spool目录下的每个文件。

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

/ tmp目录下找到名为core的文件并删除它们。 请注意,如果有任何包含换行符,单引号或双引号或空格的文件名,这将不正确。

find / tmp -name core -type f -print0 | xargs -0 / bin / rm -f

/ tmp目录下找到名为core的文件并删除它们,处理文件名的方式是正确处理包含单引号,双引号,空格或换行符的文件名或目录名。 -name测试出现在-type测试之前,以避免必须在每个文件上调用stat(2)

找 。 -type f -exec file'{}'\;

在当前目录下的每个文件上运行`file'。 请注意,大括号用单引号括起来以防止它们被解释为shell脚本标点符号。 分号用类似的反斜杠保护,尽管';' 在这种情况下也可以使用。

find / \(-perm -4000 -fprintf /root/suid.txt'%#m%u%p \ n'\),\ \(-size + 100M -fprintf /root/big.txt'%-10s% p \ n'\)

遍历文件系统一次,将setuid文件和​​目录列入/root/suid.txt和大文件到/root/big.txt中

找到$ HOME -mtime 0

搜索您的主目录中最近24小时内已修改的文件。 该命令以这种方式工作,因为每个文件上次修改后的时间除以24小时,并且任何余数都被丢弃。 这意味着要匹配-mtime

0 ,文件将不得不在过去不到24小时前修改。

找 。 - 精子664

搜索对其拥有者和群组具有读取和写入权限但其他用户可以读取但不能写入的文件。 符合这些标准但具有其他权限位设置的文件(例如,如果某人可以执行该文件)将不匹配。

找 。 -perm -664

搜索对其所有者和组具有读取和写入权限的文件,以及其他用户可以读取的文件,而不考虑是否存在任何额外的权限位(例如可执行位)。 例如,这将匹配具有模式0777的文件。

找 。 -perm / 222

搜索某人(他们的主人,他们的团体或其他人)可写的文件。

找 。 -perm / 220 找到。 -perm / u + w,g + w 找到。 -perm / u = w,g = w

所有这三个命令都执行相同的操作,但第一个使用文件模式的八进制表示,而另外两个使用符号形式。 这些命令都搜索可由其所有者或其组写入的文件。 这些文件不必由要匹配的所有者和组写入; 要么会做。

找 。 -perm -220 找到。 -perm -g + w,u + w

这两个命令都做同样的事情; 搜索可由其所有者和他们的组写入的文件。

找 。 -perm -444 -perm / 222! -perm / 111 找到。 -perm -a + r -perm / a + w! -perm / a + x

这两个命令都搜索每个人都可读的文件(-perm -444或-perm -a + r),至少在写入位设置(-perm / 222或-perm / a + w)但不可执行对于任何人(分别为!-perm / 111和!-perm / a + x)

重要提示:使用man命令( %man )查看特定计算机上的命令使用方式。