概述
说起find命令,它很基础,也很重要,可能大家都用过,但是真正用的还可以应该不多把。
find 参数很多,用好了可以干很多事情,关于这些参数的详细信息可以查询搜索引擎以及浏览帮助文档。本文章虫虫会挑一些常用的参数,重点实例介绍。最后用find实现一个脚本,实现自动化日志清理。
好让咱们开始介绍。
find 用法:
find用户很简单,最简单是直接find然后会车,会列出当前目录下的所有文件和目录。注意默认就列出所有文件,包括隐藏的文件(以.开头的文件和目录)。行为上可以ls –a一样,但是表现上有差异,结果是以竖向列表和ls –a的横向展示不一样。
对特定目录搜索的话,是在find 后紧跟要搜索的目录,比如搜索/usr 就是find /usr
下面是find用法的一般格式:
用法:find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [ path...] [expression]
关于参数我就说几个比较重要的:
1、-type 用于搜索的类型
d为目录 ,l 为软链接,f 为文件,b块设备,s socket套接字文件 p
fifo命名管道,其中f用的最多。
比如搜索/usr的文件,就用
find /usr -type f
这样搜索的好处是去除了搜索结果中的目录,默认是带目录的,如果不慎重再做进一步操作(-exec),如删除时候会误删除。小编的血的教训,不论任何时候都加上-type f
2、-name 文件名 搜索文件名
这个是find最常用的模式。为啥呢?因为find最常用就是搜索文件名,都是用这个。注意文件名是支持泛查询的,比如要查询python原文件,可以用:
find /usr/ -type f -name *.py
结果如下(各个机器可能结果不一样)
3、find . -maxdepth n 搜索深度
表示搜索子目录的层级,比如1级的话,就会只搜索本目录,下面显示和直接find的区别:
4、-mtime n 文件修改时间
类似的有-atime 创建时间和 -ctime 访问时间以及其他以分钟为单位的。为啥这个常用呢,主要用它查文件变化,比如网站目录被篡改了,用这个一查就查的到。
比如网站目录中,我们要查找下最近7天内变化的文件,就可以用下面的命令(假设网站更目录为/web):
find /web -type f -mtime -7
注意 -mtime 后面数字n 表示n天 +n表示超过n天 ,-n表示n天内。
5、-perm 格式 根据权限查找
格式支持常见的数字
find ~ -perm 0700 查找你当前用户目录下文件权限为用户可读写执行的。
6、-size (+-)n[mkc],根据文件大小查询
比如查询文件大小为小于10k的
find ~ -size -10k
注意,加减表示大于小于不带的话是恰好,m是兆字节,k是千字节,c字节,这个值和默认ls -l出来大小不带单位的值类似:
上面截图展示了,我们搜索大小 5682c的文件,恰好就是ls -al显示出来的大小5682的 .viminfo文件。
7、-ls 和 –delete
搜素的文件做后续进一步的操作,可以用-ls 和-delet用来列出和删除选择的文件用-ls 和 –delete。下面是-ls和ls –al的对比:
8、find –exec 和 –ok
find –exec 和-ok用来对,搜素的文件做后续进一步的操作。比如删除文件,可以用$
find . -name 文件名 –type f -exec rm {} \;
注意,我们再第一步时候说的加-type f ,如果不加的话,rm(注意不必要带-rf,这儿rm是多余的,看见脚本有带-rm绝对是学艺不精)会直接删掉搜索到的文件和目录,而且不会做提示。-ok会提示,所以手动操作时候建议用-ok,而脚本里面用-exce
find 和其他命令配合
find 可以和其他命令组合用,比如find搜出来的文件列表,可以用grep 在做下搜索,比如搜索python源文件,还可以用
find /usr -type f |grep "\.py"
可以用find生成文件列表,把列表传递个grep 对文件做搜索
比有两个文件 a,b内容如下:
我们搜索两个文件中包含hello word的行:
grep "hello word" `find -type f`
搜索包含chongchong的行:
grep "chongchong" `find -type f`
注意上面find -type f外面是反引号,表示执行,就是Esc下面那个符号。
其他find可以做的事情
借助find可以做很多事情:
比如我们要删除目录下空文件(大小为零的),可以用:
find -type f -size 0 -exec rm {} \;
要删除30天以前的文件用
find -type f -mtime +30 rm {} \;
Find自动化脚本自动实例
最后举个自动化实例,nginx日志分割和过期日志清理:
# 0 00 * * * /nginx/logs/ngx_logcut.sh >/dev/null 2>&
pidfile=/var/run/nginx.pid
logpath='/nginx/logs/'
keepdays=30
logfiles=(access.log error.log)
cd $logpath
for logfile in $; do
if [ ! -e $logfile ];
then
continue
fi
find . -type f -name $logfile"20*" -mtime +$keepdays -exec rm {} \;
mv $logfile $logfile$(date -d "yesterday" +"%Y%m%d")
done
kill -USR1 `cat $pidfile`
以上脚本保存为/nginx/logs/ngx_logcut.sh为,然后在cron添加一条0 00 * * * /nginx/logs/ngx_logcut.sh >/dev/null 2>& 会每天0点做日志切割,并把超过30天的日志删除掉。
设置参数说明:
pidfile nginx 进程号pid的文件
logpath目录是nginx的日志目录,可以根据自己实际修改。
keepdays是日志保存的时间,设置保存多少天就ok。
主要逻辑是:
find寻找文件,删除。
把当前的日志,mv到日志名称打时间签。
kill -USR1 nginxpid 这个是个nginx消息,nginx会重新加载配置,类似于nginx -s reload。
领取专属 10元无门槛券
私享最新 技术干货