好久没更新博客了,今晚来写一篇吧。
正文之前,先来将一个小插曲。我在面试当前岗位的时候,遇到了一个面试题目:
查找出最近三天创建的.log结尾的文件并删除。
看到的时候,内心狂喜,这不很简单吗?我就三分钟写下答案然后就交卷了。结果很是意外,答案是错的!我清楚的记得我写的答案是这样的:
find / -mtime 3 -name *.log | xargs rm -f
并且在自己的虚拟机上跑了一下,操作也成功了!我就很好奇,到底是哪里出问题了呢?后来我仔仔细细查了一下,原因出在-name 后面的选项上,应该加上单引号,否则会报错。请看下面的例子:
[root@d ~]# ls
a324.sql Centos-7.repo elasticsearch-5.6.8.zip.1 output.session
a324.sql.tar.gz c.sh Git-2.26.2-64-bit.exe s.sh
aa.sh elasticsearch-5-6-8 grafana-5.0.4-1.x86_64.rpm s.sh.tar.gz
a.ss elasticsearch-5.6.8 grafana-5.0.4-1.x86_64.rpm.nak time.log
a.tar.gz elasticsearch-5.6.8.rpm mbox wget-log
a.txt elasticsearch-5.6.8.zip nohup.out zz.sh
[root@d ~]# find ./ -name *.rpm
find: paths must precede expression: grafana-5.0.4-1.x86_64.rpm
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
[root@d ~]# find ./ -name '*.rpm'
./elasticsearch-5.6.8.rpm
./grafana-5.0.4-1.x86_64.rpm
好了。开始步入正题(外面又下雨求了!好烦)
find命令的工作方式如下:沿着文件层次结构向下遍历,匹配符合条件的文件,执行相应的操作。默认的操作是打印出相应的文件或者目录,这也可以使用-print选项来指定!
1、列出/app下的文件或目录
find /app
2、-name 查找.txt结尾的文件
find / -name '*.txt'
3、查找.txt结尾的文件,忽略.txt的大小写
find / -iname '*.txt'
4、-o 逻辑或操作符
[root@d tests]# find ./ -name '*.txt' -o -name '*.js'
./c.txt
./a.js
5、逻辑与 -a ,和-o差不多
6、正则-regex,匹配以.py或者.sh结尾的文件。-iregex忽略大小写。
find . -regex '.*\.\(py\|sh\)$'
7、!:否定参数 查找当前目录下非.txt结尾的文件
find ./ ! -name '*.txt'
8、基于目录深度搜索 -maxdepth N,-mindepth N。默认情况下,find 命令不会跟随符号链接,-L选项可以强制改变这种行为。
9、-type,后面可以跟-f -d -l -s -b
10、-atime用户最近一次访问文件的时间 -ctime文件元数据最后一次改变的时间 -mtime文件内容最后一次被修改的时间。
find ./ -atime 7表示第七天被访问的文件
find ./ -atime +7表示七天前被访问的文件
find ./ -atime -7表示七天内被访问的文件
-amin -cmin -mmin
11、-newer
12、-size基于大小搜索
find ./ -type f -size 7k 刚好7k
find ./ -type f -size +7k 大于7k
find ./ -type f -size -7k 小于7k
13、-perm基于权限
find . -type f -perm 644 查找权限为644的文件
14、-user zhaoyun找出zhaoyun拥有的所有文件
find . -user zhaoyun
15、find相应的操作
-print:默认动作,打印
-delete:删除
[root@d tests]# ls
a.html a.js A.TXT c.txt
[root@d tests]# find . -name *.txt -delete
[root@d tests]# ls
a.html a.js A.TXT
16、-exec执行命令
find命令hui