Linux 自动化基础之find

概述

说起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。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180604A0C9DQ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券