find 使用说明

find 使用说明

findLinux 操作系统中很常用的一个命令,可以根据特定条件查找指定的文件或者对查找到的文件进行进一步的操作,例如删除,重命名等。

1、find 语法格式

find 语法格式find [搜索路径] [匹配条件] [操作]

  • 搜索路径:指定搜索的起始路径,默认为当前目录,会以该目录为起点,递归查询所有目录;
  • 匹配条件:指定指定的条件来查找特定的文件
  • 具体操作:对查找到的符合条件的文件执行的操作,默认是打印输出到屏幕;

2、find 搜索路径

(1)默认的搜索方式:

  • 不指定搜索路径:不指定搜索路径时,默认以当前位置为起点,递归查询该目录下的所有目录来查找满足匹配条件的文件。
  • 指定搜索路径时:以指定的路径为起点,递归查询该目录下的所有目录来查找满足匹配条件的文件。

(2)不递归查询方式:

如果只需要查看特定目录下是否存在满足条件的文件,而不需要再递归查询该路径下的子目录,可以通过以下两个选项来进行限制。

  • -maxdepth n :在搜索路径中最多递归到第几层子目录。

  • -mindepth n :忽略低于指定深度的目录或文件。

例如:只搜索对应目录下满足条件的文件,不递归查找

find /PATH -mindepth 1 -maxdepth 1 

说明:限制 -mindepth 1 的原因是,默认当前目录的目录名满足条件,也会被匹配到。

例如

ehigh@ubuntu:~$ find /home/ehigh/work/html/devicesettingsystem/dist/js -maxdepth 1 -name js
/home/ehigh/work/html/devicesettingsystem/dist/js  # 会匹配到起始的目录名称
/home/ehigh/work/html/devicesettingsystem/dist/js/js

# 忽略低于指定深度的目录或文件后,起始路径不会被匹配到
ehigh@ubuntu:~$ find /home/ehigh/work/html/devicesettingsystem/dist/js -maxdepth 1 -mindepth 1 -name js
/home/ehigh/work/html/devicesettingsystem/dist/js/js

(3)排除单个指定路径

如果需要递归查询某个目录下的所有满足条件的文件,但是指定的子目录不想进行递归查询,可以通过find提供的以下选项实现。

  • -prune:排除特定目录,并防止 find 继续递归搜索该目录下的文件。

  • -path:和prune搭配使用,指定需要排除的子目录路径。

  • -o:用于连接多个匹配条件,逻辑是或,如果不加-o,多个匹配条件的逻辑是与。

例如:排除/proc这个子目录不递归查找

find / -path /proc -prune -o   -name "*.log" -print

(4)排除多个指定路径

如果需要排除多个子目录不进行递归查找,除了使用-o选项让多个匹配条件之间形成或的逻辑外,还需要使用 () 将多个条件组合成一个整体。

  • ():将多个条件组合成一个整体,类似于逻辑表达式中的分组,需要使用转义字符转义小括号 \(\)

例如:排除/sys/proc/run目录不搜索

find /   \( -path /proc -o -path /sys -o -path /run  \) -prune -o -name "*.log" -print

说明

find 默认会输出匹配条件的文件或目录路径,不会输出起始路径(除非它满足条件)。 通过 -prune结合-path排除指定路径时,因为-path也是一个匹配条件,所以-path指定的路径也会被打印出来。所以需要加上 -print选项,这样-path指定的路径就不会被打印出来了。

例如:如果不加-print

root@ubuntu:~# find / -path /proc -prune -o   -name "*.log"  
/run/initramfs/fsck.log
/proc  # 满足 -path /proc的路径会输出

3、find 匹配条件

find 的匹配条件决定了查找满足什么条件的文件,如果指定多个匹配条件,默认是与这种逻辑关系,如果需要是或这种逻辑关系,需要使用find的 -o 选项。

(1)find 常见条件

find 常用的匹配条件有这些:

  • -path:指定一个路径,一般和-prune结合使用,用来排除指定的子目录不递归查询。

  • -name [文件名]:按文件名搜索(支持通配符 *?[]

  • -iname [文件名]:按文件名搜索(忽略大小写)。

  • -type [类型]:按文件类型搜索

  • -size [大小]:按文件大小搜索。

  • -perm [权限]:按权限搜索

  • -user [用户]:按所有者用户搜索

  • -group [组名]:按所属组搜索

  • -mtime [天数]:按文件修改时间搜索。

根据文件大小搜索时

+ 表示大于,- 表示小于,直接数值表示等于。

c:字节数,k:KB,M:MB,G:GB。

按文件修改时间搜索时

-mtime +n:n 天前修改
-mtime -n:n 天内修改

例如:删除180天以前的执行文件

find /resources/camera/record -name "*.mp4" -type f -mtime +180 -exec rm -f {} \;

(2)find 三种逻辑

  • -a:与逻辑:find的多个匹配条件之间默认就是与逻辑,只有同时满足这些条件的文件才会被匹配到。
  • -o:或逻辑。多个匹配条件之间,只要满足一个的文件就能被匹配到。
  • -not:非逻辑。不满足匹配条件的文件会被匹配到。

例如:删除指定路径下除了名为000-default.conf的文件

find /etc/apache2/sites-enabled  \( -type f -o -type l \)  -not -name '000-default.conf' -exec rm -f {} \;

(3)find 格式说明

  • find 默认支持shell的通配符,使用 -name 来匹配文件名的时候,要使用 单引号或者双引号将通配符括起来,以确保通配符正确解析。目的就是防止 Shell 提前扩展通配符
  • find 也支持正则表达式,通过添加 -regex 选项,可以让find支持正则表达式。
  • find 使用小括号来将多个条件组合为一个整体时,小括号需要使用转义字符进行转义
  • find 多个匹配条件之间默认的逻辑关系是 -a 与逻辑,使用 -o 可以变为或逻辑。

4、find 操作说明

find 操作指的是匹配到对应的文件后,对匹配到的文件做什么操作,默认是输出打印到屏幕。常见的操作有以下这些。

  • -print:默认操作,显示匹配的文件路径。但是排除指定文件时,需要显式加上 -print ,否则会将-path指定的路径打印出来。
  • -exec [命令] {} \;:对找到的文件执行操作。

说明:find 默认不支持管道符,但是也可以通过 xargs命令来简化命令。

例如:删除180天以前的文件

find /resources/camera/record -name "*.mp4" -type f -mtime +180 |  xargs rm -f
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一只小爪子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值