Fork me on GitHub

shell脚本3-find使用

文件查找的命令–find

1
语法格式 find [路径][选项][操作]

选项参数的对照表

选项 含义
-name 根据文件名查找
-perm 根据文件权限查找
-prune 排除某些查找的目录
-user 根据文件属主查找
-group 根据文件属组查找
-mtime +n 根据文件更改时间查找
-nogroup 查找无有效属组的文件
-nouser 查找无有效属主的文件
-newer file1 !file2 查找更改时间比file1新但是比file2旧IDE文件
-type 按文件类型查找
-size -n +n 按文件大小查找
-mindepth n 从n级子目录开始搜索
-maxdepth n 做多搜索到n级子目录

常用选项:

-name

1
2
# 查找etc目录下所有以.conf结尾的文件
find /etc -name "*.conf"

-name 这个参数是能够区分大小写的:

1
2
# 找到目录下所有名字为aa的文件,但是AA不会去找
find ./ -name "aa"

如果想忽略大小写的话,可以使用-iname:

1
2
find ./ -iname "aa"
# 这样 aa AA Aa aA都会被查找出来

-user-group

1
2
3
4
# 查找属主为hdfs的所有文件
find -user hdfs
# 查找属组为yarn的所有文件
find -group yarn

-type

1
2
3
4
5
6
7
8
9
10
11
12
# 文件 f
find . -type f
# 目录 d
find . -type d
# 字符设备文件 c
find . -type c
# 块设备文件 b
find . -type b
# 链接设备文件 l
find . -type l
# 管道文件 p
find . -type p

-size 根据文件的大小来搜索文件

1
2
3
4
5
# 在etc目录下找大于1Mb的文件
find /etc -size +1M
# 小于1MB
find /etc -size -1M
# shell 里面不支持找一定大小的文件

-mtime 找n天之类修改的文件

1
2
3
4
# ex1 查找/etc目录下5天之类修改且以conf结尾的文件
find /etc -mtime -5 -name '*.conf'
# ex2 查找/etc目录下10天之前修改且属主为root的文件
find /etc -mtime +10 -user root

-mmin

1
2
3
4
# ex1 查找/etc目录下30min之前修改的文件
find /etc -mmin +30 -type f
# ex2 查找/etc目录下30min之内修改的目录
find /etc -mmin -30 -type d

-mindepth

1
2
3
4
# ex1 在/etc目录下的三级子目录下开始搜索
find /etc -mindepth 3
# ex2 在/etc目录下寻找符合条件的文件,但是最多搜索到第3级目录
find /etc -maxdepth 3 -type f

实际使用过程中用到最多的是-mtime 或者 -name

当我们查找到某些特定的文件之后,我们对这些文件执行一些特别的操作
操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 打印输出,这就是个默认的指令(每次查找完都会输出)
- print
# 对搜索到的文件执行特定的操作,格式为-exec 'command' {} \;
- exec
# ex1 搜索etc目录下以.conf为结尾的文件,且大于10k,然后将其删除
# 在执行这个操作的时候可以将根目录下的/etc目录复制到一个其他的目录里面去
mkdir test && cd test
# 将根目录下的/etc文件拷贝过来
cp -r /etc ./
find /etc/ -type f -name '*.conf' -size +10k -exec rm -rf {} \;
# ex2 将/var/log/目录下以log为结尾的文件,且更改时间在7天以上的删除
find /var/log -name '*.log' -mtime +7 -exec rm -rf {} \;
# ex3 搜索条件和1一样,只是不删除,而是将其复制到/root/conf目录下
find ./etc/ -size +10k -type f -name '*.conf' -exec cp {} /root/conf \;

逻辑运算符:

-a

-o
-not | !

1
2
3
4
5
6
# ex1 查找当前目录下,属主不是hdfs的所有文件
find . -not -user hdfs | find . ! -user hdfs
# ex2 查找当前目录下,属主属于hdfs,且大小大于300字节的文件
find . -type f -a -user hdfs -a -size +300c
# ex3 查找当前目录下的属主为hdfs或者以xml为结尾的普通文件
find . -type f -a \( -user hdfs -o -name '*.xml' \ )

find,locate,whereis和which总结及使用场景分析

locate命令介绍

  • 文件查找命令,所属软件包mlocate
  • 不同于find命令是在整块磁盘里面搜索,locate命令在数据库文件中查找
  • find是默认全部匹配,locate则是默认部分撇撇

updatedb命令

  • 用户更新/var/lib/mlocate/mlocate.db
  • 所使用配置文件为/etc/updatedb.conf
  • 改命令在后台cron计划任务中定期执行
1
2
3
find /etc/ -name 'my.cnf'
# 只要有一部分名称匹配就会给你全部搜索出来
locate my.cnf

这两者查找的结果是不同的,一个是找某个目录下,一个是全局下找。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 这个文件是一个定时的监察命令
ll /var/lib/mlocate/mlocate.db
# 通过这个命令我们可以看出它的修改时间
ll /var/lib/mlocate/mlocate.db -h
touch abc.txt && touch def.txt
# 这个时候去找的话,是找不到上面touch的文件的.
locate abc.txt
# 我们要用update命令更新一下,直接去更新/var/lib/mlocate/mlocate.db
updatedb
# 它执行的比较慢,因为它会对所有的文件做一个遍历 ,更新完成之后再做一个时间比对
ll /var/lib/mlocate/mlocate.db -h
# 然后再去做一个查找,这个时候就会查找到了
locate abc.txt

whereis

选项 含义
-b 只返回二进制文件
-m 只返回帮助文档文件
-s 只返回源代码文件
1
2
3
4
5
whereis mysql
# 它会找到mysql下的所有的二进制文件
whereis -b mysql
# 帮助文档信息
whereis -m mysql

which

  • 作用: 仅查找二进制程序文件

-b 只返回二进制文件

which mysql

-------------本文结束感谢您的阅读-------------