Linux中find命令详解

记录linux中find命令的详细用法。

文章目录

find命令简介

find 是一个搜索目录树以查找一个文件或一组文件的程序。它遍历目录树并报告与用户规范匹配的文件出现的所有实例。

简单说,就是find是一个遍历指定目录,找出符合你设定规则的一个文件或一组文件并输出。

基本语法

shell 复制代码
find [路径] [选项] [条件] [操作]

路径:要搜索的目录路径。如果未指定路径,默认为当前目录。

选项:主要控制查找行为和输出格式。

条件:定义查找标准,可以是文件名称、类型、大小等。

操作:对找到的文件执行的操作(如删除、打印等)。

常用选项

-name

-name :按名称查找,支持通配符。

shell 复制代码
find /path/to/search -name "*.txt"

查找所有扩展名为 .txt 的文件。

-iname

-iname :按名称查找,支持通配符, 大小写不敏感。

shell 复制代码
find /path/to/search -iname "*.jpg"

-type

-type :按文件类型查找。

f:普通文件

d:目录

shell 复制代码
find /path/to/search -type d

查找所有目录。

不加-type默认搜索文件

-size

-size:按文件大小查找。

shell 复制代码
find /path/to/search -size +100M

查找大于 100MB 的文件。
+ 表示大于,- 表示小于,c、k、M、G 分别表示字节、千字节、兆字节和吉字节。

大小的表示方式:

n:表示字节(默认单位)。

k:表示千字节(1K = 1024字节)。

M:表示兆字节(1M = 1024K)。

G:表示吉字节(1G = 1024M)。

大小比较符号:

+n:大于 n(例如,+10M 表示大于 10MB)。

-n:小于 n(例如,-100k 表示小于 100KB)。

n:等于 n(例如,100M 表示等于 100MB)。

示例

查找大于 100MB 的文件:

shell 复制代码
find /path/to/search -size +100M

查找小于 1KB 的文件:

shell 复制代码
find /path/to/search -size -1k

查找大小为 500字节的文件:

shell 复制代码
find /path/to/search -size 500c

注意,c 代表字节。

查找大于 2GB 的文件:

shell 复制代码
find /path/to/search -size +2G

结合其他条件使用:

查找大于 10MB 的文件并打印它们的名称:

shell 复制代码
find /path/to/search -type f -size +10M -print
shell 复制代码
find /path/to/search -type f -name "*.txt"
find /path/to/search -type d -iname "a.*"

注意事项

-size 只比较实际的文件大小,不包括文件系统的元数据或空洞文件(比如稀疏文件)。

不同文件系统的实际表示方式可能会影响到文件大小的计算,特别是在使用符号链接和文件系统的不同格式时。

-mtime,-atime,-ctime

-mtime:按文件修改时间查找。单位为天数,如-7为过去7天内。

shell 复制代码
find /path/to/search -mtime -7

查找过去 7 天内修改过的文件。

时间属性主要包括文件的访问时间(atime)、修改时间(mtime)和改变时间(ctime)。以下是一些常用的时间相关选项及其用法:

常用的时间选项
-mtime

描述:查找修改时间在指定天数范围内的文件。

用法:

shell 复制代码
find /path/to/search -mtime n

参数说明:
n:确定天数。例如,-1 表示过去 1 天,+1 表示超过 1 天,1 表示正好 1 天。

示例:

shell 复制代码
find /path/to/search -mtime -7

查找过去 7 天内修改的文件。
-atime

描述:查找访问时间在指定天数范围内的文件。

用法:

shell 复制代码
find /path/to/search -atime n

示例:

shell 复制代码
find /path/to/search -atime +30

查找 30 天前最后访问过的文件。
-ctime

描述:查找状态改变时间(如文件权限、属性等)在指定天数范围内的文件。

用法:

shell 复制代码
find /path/to/search -ctime n

示例:

shell 复制代码
find /path/to/search -ctime -5

查找过去 5 天内状态改变过的文件。
-newer

描述:查找比指定文件新(或旧)的文件。

用法:

shell 复制代码
find /path/to/search -newer file

示例:

shell 复制代码
find /path/to/search -newer reference_file

查找所有比 reference_file 新的文件。

组合使用时间选项

可以将时间选项与其他选项结合使用。例如,查找过去 7 天内被访问的 .txt 文件:

shell 复制代码
find /path/to/search -type f -atime -7 -name "*.txt"

时间单位
请注意,-atime、-mtime 和 -ctime 的单位是"天",文件的时间以 24 小时为单位进行计算。这意味着如果文件在某一特定的日期被访问、修改或状态改变,没有考虑到时间段的细节,只是按天数来计算。

-perm

-perm:按文件权限查找。

shell 复制代码
find /path/to/search -perm 644

-user

-user:按文件属主查找。

shell 复制代码
find /path/to/search -user username

-group

-group:按文件用户组查找。

shell 复制代码
find /path/to/search -group groupname

操作

打印文件路径(默认操作):

shell 复制代码
find /path/to/search -name "*.txt"

-delete

删除文件:

shell 复制代码
find /path/to/search -name "*.tmp" -delete

查找并删除所有扩展名为 .tmp 的文件。

-exec

执行命令:

使用 -exec 可以对找到的文件执行命令。

shell 复制代码
find /path/to/search -name "*.log" -exec rm {} \;

查找并删除所有扩展名为 .log 的文件。

在 find 命令中,-exec 选项允许你对找到的每一个文件执行特定的命令。这是 find 的一个非常强大的功能,因为它可以使你在查找文件的同时对这些文件执行操作。

用法

shell 复制代码
find [路径] [条件] -exec [命令] {} \;

路径:要进行搜索的目录路径。

条件:用于查找文件的条件(例如,-type, -name, -size 等)。

命令:要执行的命令。使用 {} 来占位找到的每个文件。
\;:表示命令结束。必须使用反斜杠 \ 来转义分号,以避免被 shell 解释。

示例

删除找到的所有 .tmp 文件:

shell 复制代码
find /path/to/search -type f -name "*.tmp" -exec rm {} \;

这个命令将在指定路径下查找所有扩展名为 .tmp 的普通文件,并将它们删除。

修改权限:

查找所有普通文件并将其权限设置为 644:

shell 复制代码
find /path/to/search -type f -exec chmod 644 {} \;

拷贝文件:

查找并拷贝所有 .jpg 文件到另一个目录:

shell 复制代码
find /path/to/search -type f -name "*.jpg" -exec cp {} /path/to/destination/ \;

使用 -exec 执行多个命令:

可以通过 -exec 多次调用命令,或者使用+来合并多个文件作为参数:

shell 复制代码
find /path/to/search -type f -name "*.log" -exec ls -lh {} + 

在这个示例中,ls -lh 将应用于所有找到的 .log 文件,并且会批量执行(这样更高效)而不是逐个执行。


注意事项

使用 -exec 时,命令的输出将直接在终端显示。
由于执行的命令是通过 shell 直接调用的,所以要小心命令的输入,避免导致安全问题(如代码注入)。
-exec 是一种强大的工具,但在执行 rm 等危险命令时,请务必小心,确保你确实要删除的文件。

总结

-exec 是 find 命令中的一个极其有用的选项,能够使用户在查找文件的同时执行复杂的操作。结合其他选项,-exec 可以灵活地用于各种文件管理任务

-print

使用 -print 显示文件(虽然是默认操作,但可以与其他条件结合使用):

shell 复制代码
find /path/to/search -type f -print

组合条件

可以使用 -and 和 -or 组合条件:

shell 复制代码
find /path/to/search -type f -size +1M -or -name "*.jpg"

查找所有大于 1MB 的文件或扩展名为 .jpg 的文件。

举例

查找当前目录及其子目录中所有 .txt 文件:

shell 复制代码
find . -name "*.txt"

查找 /var/log 目录下最近 10 天被修改的文件:

shell 复制代码
find /var/log -mtime -10

查找 /home 目录中大于 50MB 的文件并删除:

shell 复制代码
find /home -type f -size +50M -delete

在 /tmp 目录下查找文件树结构,并输出所有 .bak 文件的路径:

shell 复制代码
find /tmp -name "*.bak" -print

查找所有用户 user1 拥有的文件,并将权限修改为 644:

shell 复制代码
find / -user user1 -exec chmod 644 {} \;

and or

在 find 命令中,逻辑运算符 -and 和 -or 用于组合多个条件,以便更精确地进行文件查找。这使得用户可以创建复杂的查询条件来满足特定需求。

使用 -and 和 -or

默认情况下,find 命令中的条件是与关系(-and)。如果你需要明确表示与关系,可以使用 -and。而使用 -or 则表示或关系。

语法

find [路径] [条件1] -and [条件2] ... 

或者

find [路径] [条件1] -or [条件2] ...

示例

使用 -and 来查找普通文件,且文件名以 .txt 结尾:

shell 复制代码
find /path/to/search -type f -and -name "*.txt"

这个命令会查找 路径 下的所有普通文件,并且文件名以 .txt 结尾。

使用 -or 来查找普通文件,文件名以 .jpg 或以 .png 结尾:

shell 复制代码
find /path/to/search -type f \( -name "*.jpg" -or -name "*.png" \)

这里使用了括号 ( 和 ) 来明确分组条件,以求减少混淆。这个命令会查找路径下所有文件名以 .jpg 或 .png 结尾的文件。

查找在过去 7 天内被修改的或文件大小超过 10MB 的文件:

shell 复制代码
find /path/to/search \( -mtime -7 -or -size +10M \)

结合 -and 和 -or 使用以查找特定条件:

查找所有 .log 或 .txt 文件,并且是普通文件:

shell 复制代码
find /path/to/search -type f \( -name "*.log" -or -name "*.txt" \)

注意事项
括号的使用:在使用逻辑运算符时,推荐使用括号 ( 和 ) 来明确条件的优先级。需要使用反斜杠 \ 来转义括号,以避免被 shell 解释。

默认与关系:在没有使用 -and 和 -or 的情况下,条件默认是 -and 的逻辑关系。

结合其他条件

你可以将 -and 和 -or 与其他条件(如 -type、-name、-mtime 等)结合使用,使查找更加灵活。例如:

shell 复制代码
find /path/to/search -type f \( -name "*.jpg" -or -name "*.png" \) -and -size +5M

这个命令会查找所有大于 5MB 的文件,且文件扩展名为 .jpg 或 .png。

总结

使用 -and 和 -or 能够灵活地根据多个条件进行文件查找,使 find 命令变得更加强大和多样化。

find --help

shell 复制代码
Usage: find [-H] [-L] [-P] [-Olevel] [-D debugopts] [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 -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

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 ;

Valid arguments for -D:
exec, opt, rates, search, stat, time, tree, all, help
Use '-D help' for a description of the options, or see find(1)
相关推荐
滴水之功42 分钟前
VMware OpenWrt怎么桥接模式联网
linux·openwrt
ldinvicible1 小时前
How to run Flutter on an Embedded Device
linux
YRr YRr2 小时前
解决Ubuntu 20.04上编译OpenCV 3.2时遇到的stdlib.h缺失错误
linux·opencv·ubuntu
认真学习的小雅兰.2 小时前
如何在Ubuntu上利用Docker和Cpolar实现Excalidraw公网访问高效绘图——“cpolar内网穿透”
linux·ubuntu·docker
zhou周大哥2 小时前
linux 安装 ffmpeg 视频转换
linux·运维·服务器
不想起昵称9293 小时前
Linux SHELL脚本中的变量与运算
linux
the丶only3 小时前
单点登录平台Casdoor搭建与使用,集成gitlab同步创建删除账号
linux·运维·服务器·docker·gitlab
枫叶红花4 小时前
【Linux系统编程】:信号(2)——信号的产生
linux·运维·服务器
_微风轻起4 小时前
linux下网络编程socket&select&epoll的底层实现原理
linux·网络