find 用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
find path -option [ -print ] [ -exec -ok command ] {} \;
上面的 find的常用形式可以简化为:
find [path...] [expression]
-options
,指定find命令的常用选项,下节详细介绍-print
,find命令将匹配的文件输出到标准输出-exec
,find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } \;
,注意{ }和\;之间的空格find ./ -size 0 -exec rm {} \;
删除文件大小为零的文件 (还可以以这样做:rm -i find ./ -size 0
或 find ./ -size 0 | xargs rm -f &
)find . -type f -exec ls -l { } \;
在/logs目录中查找更改时间在5日以前的文件并删除它们:find /logs -type f -mtime +5 -exec rm { } \;
-ok
,和-exec
的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。find . -name "*.conf" -mtime +5 -ok rm { } \;
在当前目录中查找所有文件名以.conf结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示expression 中可用选项非常之多
文件类型 | 说明 |
---|---|
d | 目录 |
c | 字符设备 |
b | 块设备 |
p | 管道 |
f | 普通文件 |
l | 符号链接 |
s | 套接字文件 |
-name //根据文件名查找(精确查找)-iname //根据文件名查找,但是不区分大小写
这里另外介绍下文件名通配符的知识
*表示通配任意的字符
find /etc -name "*passwd"
?表示通配任意的单个字符
find /etc -name "passwd?"
[ ] 表示通配括号里面的任意一个字符
find /etc -name "[ab].sh"
-user //根据属主来查找文件-group //根据属组来查找文件
find /tmp -uid 500 //查找uid是500 的文件
find /tmp -gid 1000 // 查找gid是1000的文件
ps:有用
-a 连接两个不同的条件(两个条件必须同时满足)-o 连接两个不同的条件(两个条件满足其一即可)-not 对条件取反的
find /tmp -name "*.sh" -a -user root
find /tmp -not -user root
可以使用stat命令来查看一个文件的时间信息如下:
stat /etc/passwd
-atime-mtime-ctime-amin-mmin-cmin
所以这里atime, mtime, ctime就是分别对应的 “最近一次访问时间” “最近一次内容修改时间” “最近一次属性修改时间”,这里的atime的单位指的是“天”,amin的单位是分钟
find /tmp –atime +5 //表示查找在五天内没有访问过的文件(也就是5天前天没访问的文件)
find /tmp -atime -5 //表示查找在五天内访问过的文件
ps:在清理日志的时候,一般使用的是——最近一次内容修改的时间
find -mtime +30 -name "*[0-9]*" -exec rm {} \;
f // 普通文件 d //目录文件 l //链接文件 b //块设备文件 c //字符设备文件 p //管道文件 s //socket文件
find /tmp -type s
find /tmp -size 2M //查找在/tmp 目录下等于2M的文件
find /tmp -size +2M //查找在/tmp 目录下大于2M的文件
find /tmp -size -2M //查找在/tmp 目录下小于2M的文件
find /tmp -perm 755 //查找在/tmp目录下权限是755的文件
find /tmp -perm +222 //表示只要有一类用户(属主,属组,其他)的匹配写权限就行
find /tmp -perm -222 //表示必须所有类别用户都满足有写权限
find / -nogroup –a –nouser //在整个系统中查找既没有属主又没有属组的文件(这样的文件通常是很危险的,作为系统工程师的我们应该及时清除掉)
-print //默认情况下的动作-ls //查找到后用ls 显示出来-ok [commend] //查找后执行命令的时候询问用户是否要执行-exec [commend] //查找后执行命令的时候不询问用户,直接执行
find /tmp -name "*.sh" -exec chomd u+x {} \;
这里要注意{}的使用:替代查找到的文件
find /tmp "*.sh" -exec cp {} {}.old \;
删除查找到的超过30天没有访问过文件
find /tmp -atime +30 –exec rm –rf {} \;
也可以使用xargs来对查找到的文件进一步操作
find /tmp -name "*.old" | xargs chmod 700
find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \;
find /opt/soft/log/ -mtime +30 -name "*.log" -exec rm -rf {} \;
将 /opt/soft/log/ 目录下所有30天前带".log"的文件删除。具体参数说明如下:
"*"
表示查找所有文件,这个可以灵活运用,举一反三;大括号
+空格
+\
+;