Skip to main content

使用Linux和Unix命令查找

01 Linux基础 88 其他命令 01 学习目标以及find命令的基本使用 (七月 2025)

01 Linux基础 88 其他命令 01 学习目标以及find命令的基本使用 (七月 2025)
Anonim

Linux和Unix命令 找 执行搜索目录层次结构中的文件。

语法 找 命令:

找路径… 表达式

描述

本手册页记录了GNU版本 找 。命令 找 通过根据优先级规则(参见下面的操作符部分)从左到右评估给定表达式,搜索以每个给定文件名为根的目录树,直到结果已知;换句话说,左手边是假的 和 操作,真实 要么 ,在这一点上 找 转到下一个文件名。

第一个以:开头的参数:

  • -
  • ( 要么 ),
  • !

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

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

表达式

表达式由选项组成(影响整体操作而不是特定文件的处理,并始终返回true),测试(返回true或false值)和操作(具有副作用并返回true或假值),全部由运算符分隔。表达方式 -和 假设省略了运算符。如果表达式不包含除以外的操作 -修剪 , 然后 -打印 对表达式为true的所有文件执行。

选项

所有选项总是返回true。它们始终生效,而不是仅在达到表达式中的位置时才进行处理。因此,为清楚起见,最好将它们放在表达式的开头。

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

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

什么时候 找 正在检查一个目录,在它确定了比目录的链接数少两个子目录之后,它知道目录中的其余条目是非目录( 叶 目录树中的文件)。如果只需要检查文件的名称,则无需对它们进行统计;这使搜索速度显着提高。

测试

数字参数可以指定为:

+ N 大于 ñ。
-n 小于 ñ。
ñ 准确地说 ñ。
- 胺 文件上次访问 ñ 几分钟前。
-anewer 文件 最近一次访问文件比最近访问 文件 被修改了。 -anewer仅受-follow的影响,只有在命令行之前的-follow之前。
-atime n 文件上次访问 ñ * 24小时前。
-cmin n 文件的状态最后更改 ñ 几分钟前。
-cnewer 文件 最近更改了文件的状态,而不是修改文件。- cnewer 受到影响 -跟随 除非 -跟随 来之前 -cnewer 在命令行上。
-ctime n 文件的状态最后更改 ñ * 24小时前。
-empty 文件为空,是常规文件或目录。
-假 总是假的。
-fstype type 文件位于指定类型的文件系统上。有效的文件系统类型因Unix的不同版本而异;在某些版本的Unix或其他版本上接受的文件系统类型的不完整列表是:ufs,4.2,4.3,nfs,tmp,mfs,S51K,S52K。您可以使用-printf和%F指令来查看文件系统的类型。
-gid n 文件的数字组ID是 ñ .
-group gname 文件属于组gname(允许使用数字组ID)。
-ilname pattern 与-lname类似,但匹配不区分大小写。
-iname pattern 喜欢 -名称 ,但匹配不区分大小写。例如,模式 FO * 和 F?? 匹配文件名 富 , FOO , FOO , FOO 等
-inum n 文件有inode编号 ñ .
-ipath pattern 喜欢 -路径 ,但匹配不区分大小写。
-iregex pattern 与-regex一样,但匹配不区分大小写。
- 链接 文件有 ñ 链接。
-lname pattern File是一个符号链接,其内容与shell模式匹配。元字符不会对待 / 要么 . 特别。
-mmin n 文件的数据上次修改 ñ 几分钟前。
-mtime n 文件的数据上次修改 ñ * 24小时前。
-name pattern 文件名的基础(删除了前导目录的路径)与shell模式匹配。元字符(*, ?,和 )不匹配 . 在基本名称的开头。要忽略目录及其下的文件,请使用 -修剪 ;请参阅说明中的示例 -路径 .
- 更新文件 文件最近修改过 文件 。表达方式 -newer 受到影响 -跟随 除非 -跟随 来之前 -newer 在命令行上。
-nouser 没有用户对应文件的数字用户ID。
-nogroup 没有组对应于文件的数字组ID。
-path pattern 文件名与shell模式匹配 图案 。元字符不会对待 / 要么 . 特别;所以,例如,找 。 -path'./sr*sc 将打印一个名为./src/misc的目录条目(如果存在)。要忽略整个目录树,请使用 -修剪 而不是检查树中的每个文件。例如,要跳过目录src / emacs及其下的所有文件和目录,并打印找到的其他文件的名称,请执行以下操作:找 。 -path'./src/emacs'- prune -o -print
-perm 模式 文件的权限位是完全正确的 模式 (八进制或符号)。符号模式使用模式0作为出发点。
-perm -mode 所有权限位 模式 为文件设置。
-perm +模式 任何权限位 模式 为文件设置。
-regex pattern 文件名与正则表达式匹配 图案 。这是整个路径上的匹配,而不是搜索。例如,要匹配名为./fubar3的文件,可以使用正则表达式 。*酒吧。 要么 。* B * 3, 但不是 湾* R3.
-size n bckw 文件使用 ñ 空间单位。默认情况下,单位为512字节块,如果b,则为b ñ ,如果c跟随,则为字节 ñ ,如果k跟随,则为千字节 ñ ,如果w跟随,则为2字节字 ñ 。大小不计算间接块,但它会计算实际未分配的稀疏文件中的块。
-真正 总是如此。
-type c 文件是类型 C :
b 阻止(缓冲)特殊
C 字符(无缓冲)特殊
d 目录
p 命名管道(FIFO)
F 常规文件
符号链接
小号 插座
d 门(Solaris)
-uid n 文件的数字用户ID是 ñ .
使用的 文件上次访问 ñ 其状态最后一次更改后的几天。
- 用户uname 文件归用户所有 UNAME (允许使用数字用户ID)。
-xtype c 同样的 -类型 除非文件是符号链接。对于符号链接:if -跟随 尚未给出,如果文件是指向类型文件的链接,则为true C ;如果 -跟随 已被给予,如果 C 是l。换句话说,对于符号链接, -xtype 检查文件的类型 -类型 不检查。

操作

-exec 命令 ;

执行 命令 ;如果返回0状态,则返回true。以下所有参数 被视为命令的参数,直到由`;'组成的参数为止遇到了。字符串`{}'被当前文件名替换,它在命令的参数中出现的位置处理,而不仅仅是在单独的参数中,就像在某些版本的。这两种结构都可能需要进行转义(使用“”)或引用,以防止它们被shell扩展。该命令在起始目录中执行。

-fls 文件

真正;喜欢-ls但写信给 文件 喜欢-fprint。

-fprint 文件

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

-fprint0 文件

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

-fprintf 文件 格式

真正;像-printf但写到 文件 喜欢-fprint。

-好 命令 ;

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

-打印

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

-print0

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

-printf 格式

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

一个

警钟。

b

Backspace键。

C

立即停止从此格式打印并刷新输出。

F

表格饲料。

n

新队。

r

回程。

t

水平标签。

符 v

垂直标签。

\

字面反斜杠('')。

NNN

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

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

%%

字面百分号。

%一个

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

%一个 ķ

文件的最后访问时间,格式为 ķ ,它是`@'或C`strftime'函数的指令。可能的值 ķ 列出如下;由于系统之间的“strftime”不同,其中一些可能并非在所有系统上都可用。

@

自1970年1月1日格林尼治标准时间00:00起的秒数。

时间字段:

H

小时(00..23)

一世

小时(01..12)

ķ

小时(0..23)

小时(1..12)

中号

分钟(00..59)

p

locale的AM或PM

R

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

小号

第二(00..61)

Ť

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

X

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

ž

时区(例如,EDT),或者如果没有时区可确定则没有

日期字段:

一个

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

一个

locale的完整工作日名称,可变长度(星期日……星期六)

b

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

locale的完整月份名称,可变长度(January..December)

C

locale的日期和时间(Sat Nov 04 12:02:33 1989 1989)

d

每月的一天(01..31)

d

日期(mm / dd / yy)

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 ķ

文件的最后状态更改时间,格式为 ķ ,与%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 ķ

文件的最后修改时间,以指定的格式 ķ ,与%A相同。

%u

文件的用户名,如果用户没有名称,则为数字用户ID。

%U

文件的数字用户ID。

丢弃任何其他字符的'%'字符(但打印另一个字符)。

-修剪

如果没有给出-depth,则为true;不要下降当前目录。如果给出-depth,则为false;没有效果。

-ls

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

运营商

按优先级递减的顺序列出:

( EXPR )

强制优先。

! EXPR

如果是真的 EXPR 是假的。

-不 EXPR

与…一样 ! EXPR .

expr1 expr2

并且(暗示); 表达式2 不评估是否 表达式1 是假的。

表达式1 -一个 表达式2

与…一样 expr1 expr2 .

表达式1 -和 表达式2

与…一样 expr1 expr2 .

表达式1 -o 表达式2

要么; 表达式2 不评估是否 表达式1 是真的。

表达式1 -要么 表达式2

与…一样 表达式1 -o 表达式2 .

表达式1 , 表达式2

清单;都 表达式1 和 表达式2 总是被评估。的价值 表达式1 被丢弃;列表的值是。的值 表达式2 .

例子

find / 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目录 并删除它们。请注意,如果有任何包含换行符,单引号或双引号或空格的文件名,则此操作将无法正常工作。

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

查找名为的文件核心 在目录中或下面/ tmp目录 并删除它们,以正确处理包含单引号或双引号,空格或换行符的文件或目录名的方式处理文件名。该-名称 测试来了之前-类型 测试以避免不得不打电话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小时,任何余数都将被丢弃。这意味着要匹配-mtime

0,文件必须在过去不到24小时之前进行修改。

找 。 -perm 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)

重要: 使用 人 命令( % 人 )查看特定计算机上如何使用命令。