0053. shell命令--find

目录

53. shell命令--find

功能说明

语法格式

选项说明

说明一

帮助信息

选项说明

EXPRESSIONS

1、操作符为and、or、!的组合

2、设置项针对这次查找任务,而不是仅仅针对某一个文件,设置项总是返回true

3、测试项(test)则不同,它针对具体的一个文件进行匹配测试,如-name,-user等,返回true或者false

4、动作项( action )则是对某一个文件进行某种动作(最常见的如 -print )

说明二

表达式分类

表达式选项

测试选项

操作选项

1、-delete

2、-exec

3、-execdir

4、-fls

5、-fprint

6、-fprint0

7、-fprintf

8、-ls

9、-ok

10、-okdir

11、-print

12、-print0

13、-printf

14、-prune

15、-quit

全局选项

1、-d

2、-depth

3、-files0-from

4、-help 和 --help

5、-ignore_readdir_race

6、-maxdepth

7、-mindepth

8、-mount

9、-noignore_readdir_race

10、-noleaf

11、-version 和 --version

12、-xdev

位置选项

1、-daystart

2、-follow

3、-regextype

4、-warn 和 -nowarn

运算符选项

1、-not

2、-a

3、-and

4、-o

5、-or

说明三

主要选项和参数

常用查找条件

常用处理动作

实践操作


53. shell命令--find

功能说明

        find 命令是 Linux 和 Unix 系统中一个非常强大且常用的命令行工具,用于在目录树中搜索文件,并执行对找到的文件的操作。

        find 命令的功能是根据给定的路径和条件查找相关文件或目录,其参数灵活方便,且支持正则表达式,结合管道符后能够实现更加复杂的功能,是 Linux 系统运维人员必须掌握的命令之一。

        find 命令通常进行的是从根目录(/)开始的全盘搜索,有别于 whereis、which、locate 等有条件或部分文件的搜索。对于服务器负载较高的情况,建议不要在高峰时期使用 find 命令的模糊搜索,这会相对消耗较多的系统资源。

语法格式

find [搜索路径...] [查找条件] [处理动作]

SYNOPSIS
       find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
       
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [起始点...] [表达式]             
  • 列出的选项指的是表达式列表中的选项。这些选项控制了find的行为,需在最后一个路径名之后立即指定。
  • 五个真实选项: -H、-L、-P、-D 和 -O。如果出现,必须位于第一个路径名之前。关于这部分内容本文不做描述,具体内容可参考man7.org中的find

选项说明

说明一

帮助信息
[root@MineGi ~]# find --help
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

default path is the current directory; default expression is -print
expression may consist of: operators, options, tests, and actions:

operators (decreasing precedence; -and is implicit where no others are given):
   ( EXPR )   ! EXPR   -not EXPR   EXPR1 -a EXPR2   EXPR1 -and EXPR2
   EXPR1 -o EXPR2   EXPR1 -or EXPR2   EXPR1 , EXPR2

positional options (always true): -daystart -follow -regextype

normal options (always true, specified before other expressions):
   -depth --help -maxdepth LEVELS -mindepth LEVELS -mount -noleaf
   --version -xautofs -xdev -ignore_readdir_race -noignore_readdir_race

tests (N can be +N or -N or N): -amin N -anewer FILE -atime N -cmin N
   -cnewer FILE -ctime N -empty -false -fstype TYPE -gid N -group NAME
   -ilname PATTERN -iname PATTERN -inum N -iwholename PATTERN -iregex PATTERN
   -links N -lname PATTERN -mmin N -mtime N -name PATTERN -newer FILE
   -nouser -nogroup -path PATTERN -perm [-/]MODE -regex PATTERN
   -readable -writable -executable
   -wholename PATTERN -size N[bcwkMG] -true -type [bcdpflsD] -uid N
   -used N -user NAME -xtype [bcdpfls]
   -context CONTEXT
选项说明
  • H:表示只跟随命令行中指定的符号连接,
  • -L:表示跟随所有的符号连接,
  • -P:是默认的选项,表示不跟随符号连接。
  • -D debugoptions.:打印诊断信息
  • -Olevel Enables query optimisation.:允许查询优化
EXPRESSIONS

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

1、操作符为and、or、!的组合
! expr True if expr is false.        
-not expr   Same as ! expr, but not POSIX compliant.
expr1 expr2   implied "and"; expr2 is not evaluated if expr1 is false.
expr1 -a expr2  Same as expr1 expr2.
expr1 -and expr2 Same as expr1 expr2, but not POSIX compliant.
expr1 -o expr2  Or; expr2 is not evaluated if expr1 is true.
expr1 -or expr2  Same as expr1 -o expr2, but not POSIX compliant.
expr1 , expr2   List; both expr1 and expr2 are always evaluated.  The  value  of expr1 is discarded; the value of the list is the value of expr2.The comma operator can be useful for searching for several  different  types  of thing, but traversing the filesystem hierarchy only once.  The -fprintf action can be used to list the  various matched items into several different output files.
2、设置项针对这次查找任务,而不是仅仅针对某一个文件,设置项总是返回true
位置选项 (总是真): -daystart -follow -regextype
普通选项 (总是真,在其它表达式前指定):
-depth --help -maxdepth LEVELS -mindepth LEVELS -mount -noleaf
--version -xdev -ignore_readdir_race -noignore_readdir_race
3、测试项(test)则不同,它针对具体的一个文件进行匹配测试,如-name,-user等,返回true或者false

测试项如下:

-name  -type  -ok  -newer -perm  -atime, -ctime, -depth, -group,  -links,  -mtime,-nogroup,  -nouser,  -print,  -prune,  -size,  -user  and  -xdev -atime,  -ctime,  -depth,  -group,  -links,  -mtime,-nogroup,  -nouser,  -perm,  -print,  -prune, -size,-user and –xdev

测试项说明:

-name filename:查找名为filename的文件
-perm:按执行权限来查找
-user username:按文件属主来查找
-group groupname:按组来查找
-mtime -n/+n:按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime -n/+n:按文件访问时间来查GIN: 0px">
-ctime -n/+n:按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup:查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser:查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer f1/!f2找文件,-n指n天以内,+n指n天以前 
-ctime -n/+n:按文件创建时间来查找文件,-n指n天以内,+n指n天以前 
-nogroup:查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser:查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer f1/!f2:查更改时间比f1新但比f2旧的文件
-type b/d/c/p/l/f:查是块设备、目录、字符设备、管道、符号链接、普通文件
-size n[c]:查长度为n块[或n字节]的文件
-depth:使查找在进入子目录前先行查找完本目录
-fstype:查更改时间比f1新但比f2旧的文件
-type b/d/c/p/l/f:查是块设备、目录、字符设备、管道、符号链接、普通文件
-size n[c]:查长度为n块[或n字节]的文件
-depth:使查找在进入子目录前先行查找完本目录
-fstype:查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount:查文件时不跨越文件系统mount点
-follow:如果遇到符号链接文件,就跟踪链接所指的文件
-cpio %;:查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount:查文件时不跨越文件系统mount点
-follow:如果遇到符号链接文件,就跟踪链接所指的文件
-cpio:对匹配的文件使用cpio命令,将他们备份到磁带设备中
-prune:忽略某个目录
4、动作项( action )则是对某一个文件进行某种动作(最常见的如 -print )
actions: -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 ;
-print: find命令将匹配的文件输出到标准输出。
-ls:使用ls -dils 格式将匹配的文件输出到标准输出。
-exec: find命令对匹配的文件执行该参数所给出的shell命令。
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

说明二

表达式分类

        起始点(列表)之后的部分是表达式。这是一种查询规范,描述了我们如何匹配文件(返回真或者假)以及对匹配到的文件进行何种操作。表达式由一系列元素组成:

  • 测试(Tests):测试返回一个真或假值,通常基于我们正在考虑的文件的某个属性。例如,-empty 测试仅在当前文件为空时为真。
  • 操作(Actions):操作具有副作用(例如在标准输出上打印内容),并返回真或假,通常基于它们是否成功。例如,-print 操作会在标准输出上打印当前文件的名称。
  • 全局(Global):全局选项影响命令行中任何部分指定的测试和操作的执行。全局选项始终返回真值。例如,-depth 选项使find以深度优先的顺序遍历文件系统。
  • 位置(Positional):位置选项仅影响其后的测试或操作。位置选项始终返回真值。例如,-regextype 选项是位置选项,用于指定命令行中后续正则表达式所使用的正则表达式方言。
  • 操作符(Operators):运算符将表达式中的其他项连接起来。例如,它们包括 -o(表示逻辑或)和 -a(表示逻辑与)。如果缺少运算符,则默认使用 -a。
表达式选项
测试选项
-amin<分钟>:查找在指定时间曾被存取过的文件或目录,单位以分钟计算;
-anewer<参考文件或目录>:查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录;
-atime<24小时数>:查找在指定时间曾被存取过的文件或目录,单位以24小时计算;
-cmin<分钟>:查找在指定时间之时被更改过的文件或目录;
-cnewer<参考文件或目录>查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
-ctime<24小时数>:查找在指定时间之时被更改的文件或目录,单位以24小时计算;
-empty:寻找文件大小为0 Byte的文件,或目录下没有任何子目录或文件的空目录;
-executable 匹配当前用户可执行的文件和可搜索的目录。
-false:将find指令的回传值皆设为False;
-fstype<文件系统类型>:只寻找该文件系统类型下的文件或目录;
-gid<群组识别码>:查找符合指定之群组识别码的文件或目录;
-group<群组名称>:查找符合指定之群组名称的文件或目录;
-ilname<范本样式>:此参数的效果和指定“-lname”参数类似,但忽略字符大小写的差别;
-iname<范本样式>:此参数的效果和指定“-name”参数类似,但忽略字符大小写的差别;
-inum<inode编号>:查找符合指定的inode编号的文件或目录;
-ipath<范本样式>:此参数的效果和指定“-path”参数类似,但忽略字符大小写的差别;
-iregex<范本样式>:此参数的效果和指定“-regexe”参数类似,但忽略字符大小写的差别;
-iwholename 模式参见`-ipath`。此选项的可移植性较`-ipath`差。
-links<连接数目>:查找符合指定的硬连接数目的文件或目录;
-lname<范本样式>:指定字符串作为寻找符号连接的范本样式;
-mmin<分钟>:查找在指定时间曾被更改过的文件或目录,单位以分钟计算;
-mtime<24小时数>:查找在指定时间曾被更改过的文件或目录,单位以24小时计算;
-name<范本样式>:指定字符串作为寻找文件或目录的范本样式;
-newer<参考文件或目录>:查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
-newerXY<引用>:如果正在考虑的文件的时间戳 X 比文件引用的时间戳 Y 更新则成功。
-nogroup:找出不属于本地主机群组识别码的文件或目录;
-nouser:找出不属于本地主机用户识别码的文件或目录;
-path<范本样式>:指定字符串作为寻找目录的范本样式;
-perm<权限数值>:查找符合指定的权限数值的文件或目录;
-readable:匹配当前用户可读的文件
-regex<范本样式>:指定字符串作为寻找文件或目录的范本样式;
-samefile 名称 文件与名称指向相同的 inode。
-size<文件大小>:查找符合指定的文件大小的文件;
-type<文件类型>:只寻找符合指定的文件类型的文件;
-uid<用户识别码>:查找符合指定的用户识别码的文件或目录;
-used<日数>:查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算;
-user<拥有者名称>:查找符和指定的拥有者名称的文件或目录;
-writable:匹配当前用户可写入的文件。
-xtype<文件类型>:此参数的效果和指定“-type”参数类似,差别在于它针对符号连接检查。
-context<表达式>:仅限 SELinux。文件的安全上下文与全局模式匹配
操作选项
1、-delete

删除文件或目录。

        ⚠️警告:find 命令会将命令行作为表达式进行解析,因此将 -delete 放在首位会将指定的起始点下的所有内容删除。且 -delete 操作无法删除一个目录,除非它是空的。

        描述:如果删除成功则返回真。若删除失败,将显示错误消息,并且 find 最终退出时的状态码将为非零。

相关选项

  • -depth:在命令行中使用 -delete 操作会自动启用 -depth 选项。为了避免意外情况,通常最好在早期的 Tests 选项中明确使用 -depth 选项。
  • -prune:由于 -depth 会使 -prune 失效,因此 -delete 操作无法与-prune有效结合使用。通常,用户可能希望在实际删除操作前,先用带有-print的查找命令行进行测试,以确保在添加-delete进行实际删除时不会出现意外结果。
  • -ignore_readdir_race:-delete 与此选项一起使用时,find 会忽略自父目录读取以来文件已消失的情况下 -delete 操作的错误:它不会输出错误诊断,不会将退出代码更改为非零,并且 -delete 操作的返回代码将为真。
2、-exec

执行命令

        ⚠️警告:使用-exec操作存在不可避免的安全问题,应改用-execdir选项。

参数

  • command
  • command {} +

描述

        如果返回状态为 0,则结果为真。注意:find 命令会将所有后续参数视为 command 的参数,直到遇到包含;的参数为止。字符串 {} 会在 command 的参数中所有出现的位置被替换为当前正在处理的文件名,而不仅仅是在它单独出现的参数中,这与某些版本的 find 不同。这两种结构可能需要使用反斜杠 \ 或引号来转义,以防止被 shell 扩展。指定的命令会为每个匹配的文件运行一次。命令在起始目录中执行。

3、-execdir

在包含匹配文件的子目录中执行命令

参数

  • command
  • command {} +

描述

        类似于 -exec,但指定的 command 会在包含匹配文件的子目录中运行,而非 find 的起始点目录。与 -exec 一样,如果从shell 调用 find,{} 应加引号。这是一种更安全的调用 command 方式,因为它避免了在解析匹配文件路径时出现的竞争条件。与 -exec 操作类似,+ 形式的 -execdir 会构建一个命令行来处理多个匹配文件,但任何给定的 command 调用只会列出存在于同一子目录中的文件。如果使用此选项,必须确保 PATH 环境变量未引用.,否则攻击者可以通过在您将运行 -execdir 的目录中留下一个适当命名的文件来运行任何命令。同样,PATH 中的条目不应为空或非绝对目录名。如果使用 + 形式的任何调用以非零值作为退出状态返回,则 find 也会返回非零退出状态。如果 find 遇到错误,有时会导致立即退出,因此某些待处理的 command 可能根本不会运行。 操作结果取决于使用的是 + 还是 ; 变体。-execdir command {} + 总是返回真,而 -execdir command {} ;仅在命令返回 0 时返回真。

4、-fls

创建文件并将结果写入文件

参数

  • file

描述

        此选项始终返回真。-fls 类似于 -ls 和 -fprint,但 -fls 会将结果写入文件中。无论谓词是否匹配,输出文件始终会被创建。有关文件名中特殊字符处理的信息,请参阅“特殊文件名处理”部分。

5、-fprint

将完整文件名打印到指定文件中

参数

  • file

描述

        此选项始终返回真。若运行 find 时 file 不存在,则创建该 file;若 file 已存在,则截断其内容。文件名 /dev/stdout 和 /dev/stderr 有特殊处理,分别指向标准输出和标准错误输出。即使谓词从未匹配,输出文件也会始终创建。

6、-fprint0

参数

  • file

描述

        此选项始终返回真。类似于 -print0,但将输出写入文件;类似于 -fprint。即使谓词从未匹配,输出文件也始终会被创建。

7、-fprintf

参数

  • file

描述

        此选项始终返回真。类似于 -printf,但将输出写入文件;类似于 -fprint,即使谓词从未匹配,输出文件也会始终创建。

8、-ls

列出当前文件并输出到标准输出

无参数

描述

        此选项始终返回真。以ls -dils格式列出当前文件并输出到标准输出。块计数为 1 KB 块,除非设置了环境变量 POSIXLY_CORRECT,此时使用 512 字节块。

9、-ok

执行命令前询问用户

参数

  • command ;

描述

        类似于 -exec,但首先会询问用户。如果用户同意,则运行该命令;否则仅返回 false。若运行该命令,其标准输入将被重定向至 /dev/null。对提示的响应会与一对正则表达式进行匹配,以确定其为肯定或否定回答。若设置 POSIXLY_CORRECT 环境变量,则该正则表达式从系统获取;否则,从 find 的消息翻译中获取。如果系统没有合适的定义,将使用 find 自身的定义。无论哪种情况,正则表达式本身的解释都会受到环境变量 LC_CTYPE(字符类)和 LC_COLLATE(字符范围和等价类)的影响。

相关选项

  • -files0-from:不能与-ok同时指定
10、-okdir

参数

  • command ;

描述

        类似于 -execdir,但在执行前会以与- ok 相同的方式询问用户。如果用户不同意,则直接返回 false。如果命令被执行,其标准输入将从 /dev/null 重定向。

相关选项

  • -files0-from:不能与-okdir同时指定。
11、-print

打印完整文件名,后跟一个换行符

描述

        此选项始终返回真。如果你将 find 的输出通过管道传输到另一个程序,并且你正在搜索的文件可能包含换行符,那么应该考虑使用 -print0 而不是 -print。

12、-print0

打印完整文件名,后跟一个空字符

描述

        此选项始终返回真。包含换行符或其他类型空白字符的文件名能被正确解析,以便处理 find 输出的程序能正确理解。此选项对应于 xargs 的 -0 选项。

13、-printf

打印格式

参数

  • format

可用的转义字符和指令包括:

  • \a 警报。
  • \b 退格键。
  • \c 立即停止打印并清空输出。
  • \f 换页。
  • \n 换行。
  • \r 回车符。
  • \t 水平制表符。
  • \v 垂直制表符。
  • \0 空字符。
  • \\ 一个字面的反斜杠\。
  • \NNN 字符,其 ASCII 码为 NNN(八进制)。
  • A 一个反斜杠字符\后跟任何其他字符,都会被视为普通字符,因此它们都会被打印出来。
  • %% 一个字面的百分号。
  • %a 文件的最后访问时间,格式为 C 语言 ctime(3)函数返回的样式。 .....更多内容待补充
14、-prune

如果文件是目录,则不进入该目录

描述

        此选项始终返回真。

相关选项

  • -depth:如果指定了-depth,那么-prune将无效。
  • -delete:因为-delete隐含了-depth,所以不能有效地同时使用两者。
15、-quit

立即退出

描述

        如果没有发生错误,则返回值为零。这与 -prune 不同,因为 -prune 仅适用于被修剪目录的内容,而 -quit 则使 find 立即停止。不会有任何子进程继续运行。在程序退出之前,任何通过 -exec ... + 或 -execdir ... + 构建的命令行都会被调用。执行 -quit后,命令行中指定的文件将不再被处理。例如,find /tmp/foo /tmp/bar -print -quit 将仅打印 /tmp/foo。-quit 的一个常见用途是在找到所需内容后停止搜索文件系统。

全局选项

        始终返回真值。全局选项对命令行中较早出现的测试也会生效。为避免混淆,全局选项应在命令行上列出起始点之后、第一个测试选项、位置选项或操作选项之前指定。若在其他位置指定全局选项,find 会发出警告消息,说明这可能引起混淆。

        全局选项出现在起始点列表之后,因此与例如 -L 这样的选项不属于同一类别。

1、-d

-depth的同义词

描述

        仅用于与 FreeBSD、NetBSD、MacOS X 和 OpenBSD 兼容。

2、-depth

遍历级别

参数

  • levels

描述

        在处理目录本身之前,先处理目录中的内容。-delete 操作也隐含了 -depth。

3、-files0-from

从文件中读取起始点,而非通过命令行获取。

参数

  • file

描述

        使用此选项可以安全地给 find 命令传递任意数量的起始点。使用此选项和在命令行中传递起始点是互斥的,因此不允许同时进行。文件参数是强制性的。文件中的起始点必须用 ASCII NUL 字符分隔。两个连续的 NUL 字符,即带有零长度文件名的起始点是不允许的,这将导致错误诊断,并随后产生非零退出码。

        与标准调用不同,在标准调用中,如果没有传递路径参数,find 会默认将当前目录作为起始点。起始点的处理方式与其他情况相同,例如,find 命令会递归进入子目录,除非另有阻止。若要仅处理起始点,可以额外传递-maxdepth 0参数。

         其他说明:如果一个文件在输入文件中被列出多次,则其是否会被多次访问未作规定。如果在查找操作期间文件被修改,结果同样未作规定。最后,find 退出时(无论是通过-quit还是其他方式),命名文件中的查找位置也未作规定。此处未作规定意味着它可能有效也可能无效,或者不做任何特定的事情,并且该行为可能因平台或 findutils 版本而异。

        💡可以使用-files0-from从标准输入流中读取起始点列表,例如从管道中读取。在这种情况下,不允许使用-ok和-okdir操作,因为它们会干扰从标准输入读取以获取用户确认。

        ⚠️警告:如果给定文件为空,find 不会处理任何起始点,因此在解析完程序参数后会立即退出。

4、-help 和 --help

打印 find 命令行用法的摘要并退出。

5、-ignore_readdir_race

描述

        通常情况下,当 find 无法对文件进行状态检查(stat)时,会发出错误消息。如果您启用此选项,并且在 find 从目录读取文件名,到尝试进行状态检查之间的时间内文件被删除,则不会发出任何错误消息。这也适用于命令行中指定的文件或目录。此选项在命令行读取时生效,这意味着您不能在文件系统的某部分启用此选项,而在另一部分禁用它(如果需要这样做,您需要发出两个 find 命令,一个启用选项,一个不启用)。此外,使用-ignore_readdir_race 选项时,如果在读取父目录后文件已消失,find 命令将忽略 -delete 操作的错误:它不会输出错误诊断信息,并且-delete 操作的返回码将为真。

6、-maxdepth

最大遍历级别

参数

  • levels

描述

        最多向下遍历 levels 级(一个非负整数)目录层级。使用 -maxdepth 0 表示仅对起始点本身应用测试和操作。

7、-mindepth

最小遍历级别

参数

  • levels

描述

        在小于指定级别(非负整数)的层级上不执行任何测试或操作。使用 -mindepth 1 表示处理除起始点外的所有文件。

8、-mount

不在其他文件系统中下降目录

描述

        这是 -xdev 的替代名称,用于与其他一些版本的 find 兼容。

9、-noignore_readdir_race

描述

        关闭了 -ignore_readdir_race 的效果。

10、-noleaf

不进行优化。

描述

        不通过假设目录包含比其硬链接数少 2 个子目录来进行优化。在搜索不遵循 Unix 目录链接惯例的文件系统时,需要此选项,例如 CD-ROM、MS-DOS 文件系统或 AFS 卷挂载点。在正常的 Unix 文件系统上,每个目录至少有 2 个硬链接:其名称及其.条目。此外,其子目录(如果有)各自有一个指向该目录的..条目。当 find 检查一个目录时,在它已经统计了比目录链接数少 2 个子目录之后,它知道该目录中的其余条目是非目录(目录树中的“叶”文件)。如果只需要检查文件的名称,则无需对其进行状态检查;这可以显著提高搜索速度。

11、-version 和 --version

打印 find 的版本号并退出。

12、-xdev

不进入其他文件系统的目录。

位置选项

        始终返回真值。它们仅影响命令行中后续的测试。

1、-daystart

从今天开始

        用于 -amin、-atime、-cmin、-ctime、-mmin 和 -mtime

描述

        从今天开始而非从 24 小时前开始。此选项仅影响命令行中后续出现的测试。

2、-follow

解引用符号链接。

描述

        已弃用,请改用-L选项。隐含 -noleaf。-follow 选项仅影响命令行中出现在其后的那些测试。除非已指定-H或-L选项,否则-follow选项的位置会改变 -newer 谓词的行为;作为-newer参数列出的任何文件,如果它们是符号链接,则会被解引用。同样的情况适用于-newerXY、-anewer 和 -cnewer。类似地,-type 谓词将始终匹配符号链接所指向的文件类型,而非链接本身。使用 -follow会导致 -lname 和 -ilname 谓词始终返回 false。

3、-regextype

更改正则表达式语法

参数

  • type

描述

        更改 -regex 和 -iregex 测试在命令行后续部分所理解的正则表达式语法。要查看已知的正则表达式类型,请使用 -regextype help。Texinfo 文档解释了各种正则表达式类型的含义及其差异。如果您不使用此选项,find 的行为如同已指定正则表达式类型为emacs。

4、-warn 和 -nowarn

开启或关闭警告消息。

描述

        这些警告仅适用于命令行使用,不适用于 find 在搜索目录时可能遇到的情况。默认行为是:如果标准输入是 tty,则对应 -warn;否则对应 -nowarn。如果产生与命令行使用相关的警告消息,find 的退出状态不受影响。如果设置了 POSIXLY_CORRECT 环境变量,并且也使用了 -warn,则未指定哪些(如果有)警告会被激活。

运算符选项

        运算符按优先级递减顺序列出:

  • (expr) 强制优先级。由于括号对 shell 有特殊含义,通常需要对它们进行引用。许多示例为此使用了反斜杠:\(...\) 而非 (...)。
  • ! expr 若表达式为假则结果为真(取反)。此字符通常也需要防止被 shell 解释。

        💡提示:当-a 隐式指定(例如两个测试之间没有显式运算符)或显式指定时,其优先级高于 -o。例如,find . -name foo -o -name bar -print 永远不会打印 foo。

1、-not

参数

  • expr

描述

        等同于! expr,但不符合 POSIX 标准。

2、-a

参数

  • expr1 -a expr2

描述

        两个连续的表达式被视为隐含地用-a连接;如果expr1为假,则不评估expr2。等同于expr1 expr2。

3、-and

参数

  • expr1 -and expr2

描述

        与-a相同。但不符合 POSIX 标准。

4、-o

参数

  • expr1 -o expr2

描述

        expr1 和 expr2 始终都会被评估。expr1 的值会被丢弃;列表的值即为 expr2 的值。逗号运算符(,)在搜索多种不同类型的事物时非常有用,但只会遍历文件系统层次结构一次。-fprintf 动作可用于将各种匹配项列出到多个不同的输出文件中。若 expr1为真,则不评估 expr2。

5、-or

参数

  • expr1 -or expr2

描述

        与 -o 相同。但不符合 POSIX 标准。

说明三

主要选项和参数
搜索路径:指定 find 命令开始搜索的目录路径。如果省略,则默认为当前目录。
查找条件:根据文件名、大小、类型、权限、所有者、修改时间等属性来搜索文件。可以组合使用多个条件。
处理动作:对找到的文件执行的操作,如打印文件名、删除文件、执行命令等。
常用查找条件
-name:按文件名查找。支持通配符,如 *、? 等。
-iname:与 -name 类似,但查找时不区分大小写。
-type:根据文件类型查找,如 f 表示普通文件,d 表示目录。
-size:根据文件大小查找,单位可以是 c(字节)、k(千字节)、M(兆字节)、G(吉字节)等,如 +100M 表示大于 100MB 的文件。
-user:按文件属主查找。
-group:按文件属组查找。
-perm:按文件权限查找。
-mtime、-atime、-ctime:按文件内容的最后修改时间、最后访问时间、状态改变时间查找,单位是天。-mtime -7 表示在最近 7 天内修改过的文件。
-newer:比某个文件更新的文件。
常用处理动作
-print:打印文件名(默认动作)。
-exec:对匹配的文件执行指定的 shell 命令。命令格式为 '-exec 命令 {} \;',其中 {} 是一个特殊的字符串,对于每一个匹配的文件,{} 会被替换成相应的文件名。
-ok:与 -exec 类似,但在执行每个命令之前,都会询问用户是否确认。
-delete:删除匹配的文件。

实践操作

1. 搜索路径选择
# 指定 find 命令开始搜索的目录路径。如果省略,则默认为当前目录
# 只指定搜索的目录路径,它会查找目录及子目录所有内容(包含隐藏文件)

1.1 默认路径
cd
find    #直接find查找,默认当前目录
tree -a /root    #查看/root下所有文件是否和find查找的一样
find .    #和刚才直接查找一样

1.2 指定路径
find /etc/dhcp/    #指定搜索的目录路径
tree -a /etc/dhcp/    #也查看一下
find /etc/sysconfig/network-scripts/

2. 设定查找条件
# 可以根据文件名、大小、类型、权限、所有者、修改时间等属性来搜索文件。可以组合使用多个条件

2.1 -name:按文件名查找。支持通配符,如 *、? 等
find /etc/ -name passwd
find /etc/ -name pass*
find /etc/ -name pass?
find /etc/ -name passw?
find /etc/ -name *.conf

2.2 -iname:与 -name 类似,但查找时不区分大小写。
mkdir -p /test/find/{TEST,test}dir
cd /test/find/
ls
find . -name tESTdir
find . -iname tESTdir

2.3 -type:根据文件类型查找,如 f 表示普通文件,d 表示目录。
# f:表示一般文件
# d:表示目录
# l:表示软链接(快捷方式)
# p:表示PIPE管道文件
# s:表示socket通信套接字文件
# c:表示字符设备文件
# b:表示块设备文件

find /var/log/ -type f
find /dev/ -type d

2.4 -size:根据文件大小查找
# 单位可以是 c(字节)、k(千字节)、M(兆字节)、G(吉字节)等,如 +100M 表示大于 100MB 的文件。

find /var/log/ -size +1M    #搜索大于 1M 的文件
find /var/log/ -size -1M    #搜索小于 1M 的文件
find /var/log/ -size 1M    #搜索等于 1M 的文件

2.5 -user:按文件属主查找
useradd testuser1
ll
chown testuser1: testdir/
ll
find . -user testuser1
find . -user root

2.6 -group:按文件属组查找
ll
find . -group testuser1
find . -group root

2.7 -perm:按文件权限查找
ls -la
find . -perm 755
find . -perm 0755

2.8 -mtime、-atime、-ctime:按文件内容的最后修改时间、最后访问时间、状态改变时间查找,单位是天。
# -mtime -7 表示在最近 7 天内修改过的文件。
# 访问时间 (-atime/天,-amin/分钟):用户最近一次访问时间。
# 修改时间 (-mtime/天,-mmin/分钟):文件最后一次修改时间。
# 变化时间 (-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。

find /etc/ -type f -mtime -7    #搜索最近七天内被访问过的所有文件
find /etc/ -type f -mtime 7    #搜索恰好在七天前被访问过的所有文件
find /etc/ -type f -mtime +7    #搜索超过七天被访问过的所有文件
find /etc/ -type f -amin +10    #搜索访问时间超过10分钟的所有文件

2.9 -newer:比某个文件更新的文件。
find /etc/ -type f -newer /etc/passwd    #找出比 /etc/passwd 修改时间更长的所有文件

2.10 -path:匹配文件路径或者文件
find /usr/ -path "*openssh*"
find /usr/ -path "openssh*"
find /usr/ -path "*openssh"

2.11 -regex 和 iregex 基于正则表达式匹配文件路径,后者忽略大小写
find /usr/libexec/ -regex ".*\(\.sh\|\.py\)$"
find /usr/libexec/ -regex ".*\(\.SH\|\.PY\)$"
find /usr/libexec/ -iregex ".*\(\.SH\|\.PY\)$"

2.12 -prune:搜索时忽略指定的目录
find / -name "*.sh"
find / -path "/usr" -prune -o -name "*.sh"    #忽略单个目录
ls -F /boot/ |grep /
find /boot/ \( -path /boot/grub2 -o -path /boot/efi \) -prune -o -print    #忽略多个目录,注意括号的空格
   
2.13 -maxdepth 和 -mindepth:最大遍历级别和最小遍历级别
mkdir -p 1/2/3/4/5/6
tree 1
find 1
find 1 -maxdepth 2
find 1 -mindepth 2

3. 指定处理动作
# 对找到的文件执行的操作,如打印文件名、删除文件、执行命令等。

3.1 -print:打印文件名(默认动作)。
find /etc/ -name passwd 
find /etc/ -name passwd -print

3.2 -exec:对匹配的文件执行指定的 shell 命令。
# 命令格式为 '-exec 命令 {} \;
# 其中 {} 是一个特殊的字符串,对于每一个匹配的文件,{} 会被替换成相应的文件名。
find . -user testuser1 -exec ls -ld {} \;
find /etc/ -type f -exec find {} -size +1M \;
find /etc/ -type f -size +1M    # 当然也可以这样写

cat all_test
echo hello >file1.txt
echo world >file2.txt
find . -type f -name "*.txt" -exec cat {} \; >all_test    #查找当前目录下所有.test文件并把他们拼接起来写入到all_test文件中
cat all_test

find . -type f -name "*.txt" -exec printf "File: %s\n" {} \;    #找出当前目录下所有.test文件并以“File:文件名”的形式打印出来

3.3 -ok:与 -exec 类似,但在执行每个命令之前,都会询问用户是否确认
# 查找当前目录及其所有子目录中所有的空目录(不包含任何文件或子目录的目录),并在删除每个空目录之前询问用户是否确认
ll
find . -type d -empty -ok rm -r {} \;    #y 或 yes:确认;n 或 no:取消,演示输入n
find . -type d -empty -ok rm -rf {} \;    #加入f选项还是需要确认

3.4 -delete:删除匹配的文件
ll
find . -type d -empty
find . -type d -empty -delete
find . -type d -empty
ll

4. 操作符为 and、or、! 的组合
# and:-a,表示并且,两种条件都满足才成立
# or:-o,表示或者,满足其中一个条件即可
# !:否定,取反

4.1 -o (or)
mkdir dir{1..3}.pdf
touch file{.txt,.pdf,.jpg}
ll file.*
find . \( -name "*.txt" -o -name "*.pdf" \)
find . -name "*.txt" -o -name "*.pdf"
find . -type d -o -name "*.pdf"

4.2 -a (and)
find . -type d
find . -type d -a -name "*.pdf"
find . -type d -name "*.pdf"

4.3 !  ---->(标记:演示出错2,在后面)
find . -type d
find . -type d !
find . ! -type d

5. -H –L –P 指定对符号连接的处理方式
# -H:表示只跟随命令行中指定的符号连接,
# -L:表示跟随所有的符号连接,
# -P:是默认的选项,表示不跟随符号连接。
ln -s /bin rootbin
ls
find -P . -name pwd
find . -name pwd
find -L . -name pwd
find -H . -name pwd
find -H rootbin . -name pwd

6. find 与 xargs
# 在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。
# 但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。
# 错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。

# find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。
# 这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

# 在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,
# 并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,
# 系统性能下降的问题,因而效率不高;而使用xargs命令则只有一个进程。
# 另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,
# 以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。
6.1 在当前目录下找到所有文件,并且查看它们的文件类型
find . -type f |xargs file
find ~/ -type f -print | xargs file  

6.2 在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到core.log文件中
find / -name "core" -print
find / -name "core" -print | xargs echo ""
find / -name "core" -print |wc -l
find / -name "core" -print | xargs echo "" |wc -l
find / -name "core" -print | xargs echo "" >core.log
tail -5 core.log

6.3 用 grep 命令在得到的所有普通文件中搜索 root 这个词
find /etc/aliases -type f -print |xargs grep root
find /etc/aliases -type f -print |xargs grep root |wc -l

6.4 列出指定时间的内容
find . -ctime -3 -exec ls -l {} \;    #三天内变化了的文件
find ./ -mtime +3 -print |xargs ls -l    #三天以前访问过的文件 

6.5 列出文件大小为零的文件和其它操作
find . -size 0 
find . -size 0 | xargs ls -lh
find . -size 0 | xargs rm -rf
find . -size 0 | xargs ls -lh
find . -size 0 | xargs rm -rf    #没有内容再删除一遍
find . -size 0 | xargs ls -lh    #还会显示内容,可能原因如下
# 大概原因是标准输入没有内容的时候,xargs就只是把命令按无参的情况执行一遍,
# 这find . -size 0在这种情况下不会有输出,所以通过管道传递给xargs的内容就是空的,
# 那就相当于直接执行一遍ls -lh了

6.6 使用 xargs 执行 mv(移动文件或目录)
mkdir test_mv_dir{1,2}
ls test_mv_dir{1,2}
find . -type f
find . -type f |xargs -i mv {} test_mv_dir1/    #第一种写法
ls test_mv_dir1/
find test_mv_dir1/ -type f
find test_mv_dir1/ -type f |xargs mv -t test_mv_dir2/    #第二种写法
ls test_mv_dir2/

6.7 删除带有空格的文件
a 实验环境
ls
mv * test_mv_dir1
touch "   a   a a     bb b "\ {1..5}    # 创建空格文件
ll

b 直接删除    
rm -rf a   a a     bb b  1    # 复制名称无法删除
ll
rm -rf "a   a a     bb b  1"    # 加上双引号也无法删除
ll
rm -rf \ \ \ a\ \ \ a\ a\ \ \ \ \ bb\ b\ \ 1    #使用转义字符进行删除
ll

c 使用find删除方法1
ll
find . -name *2
find . -name *2 |xargs
find . -name *2 |xargs rm -rf
ll
find . -name *2 |xargs -i rm -rf {}
ll

d 使用find删除方法2
find . -name *3 
find . -name *3 -exec rm -rf {} \;
ll

e 使用find删除方法3 
find . -name *4
echo $(find . -name *4)    # 发现文件的空格被压缩了
rm -rf $(find . -name *4)    # 先来删除一下试试
ll    # 发现删除不了
echo "$(find . -name *4)"    # 加个双引号,显示原内容
rm -rf "$(find . -name *4)"    # 再次试一下
ll    # 文件已被删除

f 使用find删除方法4
# 使用 -inum 选项替换 -name,使用文件的 inode 会更精准些
ls -li
ls -i | grep 5$ |cut -d' ' -f1
inode=$(ls -i | grep 5$ |cut -d' ' -f1)
echo $inode
find . -inum $inode
find . -inum $inode |xargs -i rm -rf {}
ls

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MineGi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值