目录
find 使用说明
find
是 Linux
操作系统中很常用的一个命令,可以根据特定条件查找指定的文件或者对查找到的文件进行进一步的操作,例如删除,重命名等。
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