你笑了

你的笑,是星星跳跃浪花的笑

0%

find命令

find

在指定目录下查找文件

如何不设置任何参数,则 find 命令将在当前目录下查找子目录与文件,并且将查找到的子目录和文件全部显示出来

语法

1
find [option] [path...] [expression...]
  • optiosn 后的参数被视为path,直到第一个以-开头的参数及之后的参数被视为expression

  • 如果没有给出路径,则使用当前目录

  • 如果没有给出表达式,则使用表达式print

option

  • H
  • L
  • P
  • D
  • Olevel

path

多个路径用空格隔开

1
find ./test ./dir2 -type f -name "abc*"

expression

  • 一种查询规范,描述如何匹配文件以及如何处理匹配的文件,一个表达式是由一系列事物组成,包括 Tests、Actions、Global options、Positional options、Operators

常用表达式组成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
-amin<分钟>:#查找在指定时间被存取过的文件或目录,单位分钟
-mmin<分钟>:#查找在指定时间被更改过的文件或目录,单位分钟
-mtime<24小时数>:#查找在指定时间被更改过的文件或目录,单位24小时
-atime<24小时数>:#查找在指定时间被写入过的文件或目录,单位24小时
-cmin<分钟>:#查找在指定时间之内被更改过的文件或目录
-ctime<24小时数>:#查找在指定时间之时被更改的文件或目录,单位以24小时计算
-daystart:#从今天开始计算时间
-depth:#从指定目录下最深层的子目录开始查找
-exec<执行指令>:#如果find命令返回值为True,就执行该指令
-false:#将find命令返回值都设为False
-fstype<文件系统类型>:#只查找此指定文件系统类型下的文件或目录
-gid<群组识别码>:#查找匹配此群组识别码的文件或目录
-group<群组名称>:#查找匹配此群组名称的文件或目录
-help或——help:#帮助信息
-links<连接数目>:#查找匹配指定的硬连接数目的文件或目录
-maxdepth<目录层级>:#设置查找的最大目录层级
-mindepth<目录层级>:#设置查找的最小目录层级
-name<范本样式>:#指定字符串作为寻找文件或目录的范本
-path<范本样式>:#指定字符串作为寻找目录的范本样式
-perm<权限数值>:#查找符合指定的权限数值的文件或目录
-size<文件大小>:#查找符合指定的文件大小的文件
-true: #将find命令返回值都设为True
-type<文件类型>:#只查找匹配指定的文件类型的文件
-uid<用户识别码>:#只查找匹配指定的用户识别码的文件或目录
-user<拥有者名称>:#只查找匹配指定的拥有者名称的文件或目录
-version:#显示版本信息

GLOBAL OPTIONS

find [option] [path] [global options] [test positional options action]

-maxdepth levels

最多向下查找 levels 个深度的目录

-mindepth levels

查找 距离当前目录至少 levels 个深度的目录

TEST

1
2
3
+n    for greater than n
-n for less than n
n for exactly n

-2 距离此时两天之内

+2 两天之前,不包括两天之前的一天(也就是不包括-2和2的)

2 两天之前的一天内

当前是24号9点

n = +1 查找22号9点以前的数据

n=1 查找22号9点到23号9点的数据

n=-1 查找23号9点到当前24号9点的数据

-name pattern
1
2
#在/mingongge目录下查找包含mingongge开头的文件名
[root@centos7 ~]# find /mingongge -name "mingongge*.log"
-path pattern
1
2
#匹配文件路径或者文件
[root@centos7 ~]# find /usr/ -path "*txt*"
-perm mode
1
2
当前目录下找出权限为777的文件
[root@centos7 ~]# find . -type f -perm 777#找出当前目录下所有者是mingongge的所有文件
-regex pattern
1
2
#基于正则表达式匹配文件路径
[root@centos7 ~]# find . -regex ".*(.txt|.log)$"
-iregex pattern
1
2
#忽略大小写
[root@centos7 ~]# find . -iregex ".*(.txt|.log)$"
-type c

文件类型

1
[root@centos7 ~]# find . -type f -name "*.log" ! -perm 644
-user uname

文件所有者为 uname 的文件

1
[root@centos7 ~]# find . -type f -user mingongge
-size n[cwbkMG]

文件大小

1
2
3
4
5
6
7
8
#查找当前目录下文件大小超过500M的文件
[root@centos7 ~]# find . -type f -size +500M

#查找当前目录超过500M的文件,并打印出文件的详细属性信息
[root@centos7 ~]# find . -type f -size +800M -print0 | xargs -0 ls -l

#查找当前目录超过500M的文件,并打印出文件的具体大小
[root@centos7 ~]# find . -type f -size +500M -print0 | xargs -0 du -h|sort -nr
-atime n

访问时间:用户最近一次访问时间

1
2
3
4
5
#查找最近10天内被访问过的所有文件
[root@centos7 ~]# find . -type f -atime -10

#查找超过10天内被访问过的所有文件
[root@centos7 ~]# find . -type f -atime +10
-amin n

访问时间:用户最近一次访问时间

1
2
#查找访问时间超过20分钟的所有文件
[root@centos7 ~]# find . -type f -amin +20
-mtime n

修改时间:文件最后一次被修改的时间

-mmin n

修改时间:文件最后一次被修改的时间

-ctime n

变化时间:文件元数据(例如权限等)

-cmin n

变化时间:文件元数据(例如权限等)

ACTIONS

-delete
-exec command ;

执行命令,;之前的参数都是被执行命令的参数

\; 需要转义,使之传递给 find 命令

{} ,占位符,被替换为 find 找到的所有文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#找出当前目录下所有者为root的文件,并把所有者更改为mingongge这个用户
[root@centos7 ~]# find .-type f -user root -exec chown mingongge {} ;

#找出当前用户家目录下所有的.log文件并执行删除动作
[root@centos7 ~]# find $HOME/. -name "*.log" -exec rm {} ;

#查找当前目录下所有.log文件并将他们拼接起来然后写入到mingongge.txt这个文件中
[root@centos7 ~]# find . -type f -name "*.log" -exec cat {} ;> /mingongge.txt

#查找出10天前的.log文件,然后全部移动到mingongge目录下
[root@centos7 ~]# find . -type f -mtime +10 -name "*.log" -exec cp {} mingongge ;

#找出当前目录下所有.log文件,然后以“File:文件名”的格式打印输出到屏幕上
[root@centos7 ~]# find . -type f -name "*.log" -exec printf "File: %sn" {} ;

OPERATORS

! expr

否定表达式

1
2
#找出/mingongge下不是以.log结尾的文件
[root@centos7 ~]# find /mingongge ! -name "*.log"
-not expr

同 !

expr1 -a expr2

逻辑 and

1
2
#当前目录及子目录下查找所有以.txt和.log结尾的文件
[root@centos7 ~]# find . -name "*.txt" -a -name "*.log"
expr1 -o expr2

逻辑或

1
[root@centos7 ~]# find . -name "*.txt" -o -name "*.log"

应用

当前目录搜索所有文件,文件内容包含xxx

1
find . -type f -name "*" | xargs grep "192.168.1.111"

查找系统中前5的大文件

1
# find / -type f -print0 | xargs -0 du -h | sort -rh | head -n 5

错误提示重定向

普通用户查找的时候会出现很多权限不够的错误提示,可以把它们重定向到其他地方

1
find / -name "xx" 2>/dev/null

删除7天之前的日志

1
find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \;

最后的;不能丢

示例

  • 当前目录下查找30天之前的普通文件,并删除
1
find . -type f -mtime +30 -exec rm -rf {} \; 
  • /opt/soft/log/ 目录下,删除30天之前的,以 log 结尾的文件
1
find /opt/soft/log/ -mtime +30 -name "*.log" -exec rm -rf {} \;