目录
0 引言
Linux find命令功能非常强大,往往在搜索定位时具有神奇的效果,可以简化查询操作流程,往往只需一条命令搞定。
1 命令基本用法
(1)语法格式
find [路径] [选项] [操作]
(2)选型参数
选项 | 含义 |
-name | 根据文件名查找 |
-perm | 根据文件权限查找 |
-prune | 该选项可以排除某些查找目录 |
-user | 根据文件属主查找(所属的用户) |
-group | 根据文件属组查找 |
-mtime -n | +n | 根据文件更改时间查找 |
-nogroup | 查找无有效属组的文件 |
-nouser | 查找无有效属主的文件 |
-newer file1 ! file2 | 查找更改时间比file1新但比file2旧的文件 |
-type | 按文件类型查找 |
-size -n +n | 按文件大小查找 |
-mindepth n | 查找子目录的最小深度(按n级字目录开始搜索) |
-maxdepth n | 查找子目录的最大深度n(最多搜索到n级子目录) |
2 案例实战
(1)-name:查找/etc目录下以conf结尾的文件
[root@bigdata3 ~]# find /etc -name '*conf'| head -n10
(2) -iname :查找当前目录下文件名为aa的文件(不区分大小写)
[root@bigdata3 dan_test]# find . -iname aa
(3) -user 查找文件属主为hive的所有文件
[root@bigdata3 usr]# find . -user hive
(4) -group 查找文件属组为hadoop的所有文件
[root@bigdata3 usr]# find . -group hadoop | tail -n10
(4) -type
-type
f 文件 find . -type f
d 目录 find . -type d
c 字符设备文件 find . -type c
b 块设备文件 find . -type b
l 链接文件 find . -type l
p 管道文件 find . -type p
(5)-size
-size
-n 小于大小n的文件
+n 大于小于n的文件
1) 查找/etc目录下小于100000字节的文件
[root@bigdata3 etc]# find /etc -size -100000c | head -n10
2) 查找/etc目录下大于1M的文件
[root@bigdata3 etc]# find /etc -size +1M
(6)-mtime
-mtime
-n n天以内修改的文件
+n n天以外修改的文件
n 正好n天修改的文件
1) 查找/etc目录下50天之内修改且以conf结尾的文件
[root@bigdata3 etc]# find /etc -mtime -50 -name '*.conf'
2)查找/etc目录下10天之前修改且属主为root的文件
[root@bigdata3 etc]# find /etc -mtime +50 -user root
-mmin
-n n分钟以内修改的文件
+n n分钟以外修改的文件
3)查找/etc目录下30分钟之前修改的文件
find /etc -mmin +30
4)查找/etc目录下30分钟之内修改的目录
[root@bigdata3 etc]# find /etc -mmin -30 -type d
(7) -mindepth n
-mindepth n 表示从n级子目录开始搜索
1) 在/etc下的6级子目录开始搜索
[root@bigdata3 etc]# find /etc -mindepth 6
(8) -maxdepth n
-maxdepth n 表示最多搜索到n级子目录
1) 在/etc下搜索符合条件的文件,但最多搜索到2级子目录
find /etc -maxdepth 2 -name '*.conf'
2)搜索二级子目录下的文件
[root@bigdata3 etc]# find /etc -mindepth 2 -maxdepth 2 -name '*.conf'
(9)-nouser
-nouser 查找没有属主的用户
find . -type f -nouser
(10) -nogroup
-nogroup 查找没有属组的用户
find . -type f -nogroup
(11) -perm
-perm 权限
查找文件为777的文件
find . -perm 777
(12)-prune
通常和-path一起使用,用于将特定目录排除在搜索条件之外
逻辑运算符:
-a 与
-o 或
-not或! 非
1)查找当前目录下所有普通文件,但排除aa目录
[root@bigdata3 dan_test]# find . -path ./aa -prune -o -type f
2)查找当前目录下所有普通文件,但排除aa和AA目录
find . -path ./aa -prune -o -path ./AA -prune -o -type f
注意:为什么排除两个目录的时候用-o(or)而不是-a(and)呢?我们可以这样理解,若查找两个目录则用-a(A and B)相当于一个区 间内,排除的话相当于区间外,自然是or(-o).
3) 查找当前目录下所有普通文件,但排除aa和AA目录,但属主为hdfs
find . -path ./aa -prune -o -path ./AA -prune -o -type f -a -user hdfs
4)查找当前目录下所有普通文件,但排除aa和AA目录,但属主为hdfs,且文件大小必须大于500字节
find . -path ./aa -prune -o -path ./AA -prune -o -type f -a -user hdfs -a -size +500c
对于为什么-prune-o后面是-o而不是-a,这个解释起来比较麻烦可理解为prune的固定用法即可。
参考链接:
-prune用法很严格,若要忽略某个目录一般采用如下固定模式:
find 查找文件的目录 -path 需要排除的目录 -prune -o -name 需要查询的内容
注意事项:理解为固定用法就可以了(-path->-prune->-o>-print)忽略四部曲
1)-prune 必须和 -path, -o 一起使用
2)-prune -o 的顺序不 能调换
3)-name等必须放在-prune -o后面才能使用
4)如果后面有管道符号前面需要加-print参数
5)查找当前目录下的属主为hdfs或者以xml结尾的普通文件
find . -type f -a \( -user hdfs -o -name '*.xml' \)
(13) -exec
-exec 对搜索到的文件执行特定的操作,固定格式为-exec 'command' {} \;
-ok 和exec功能一样,只是每次操作都会给用户提示
1)搜索/etc下的文件(非目录),文件名以conf结尾,且大于10k,然后将其删除
find ./etc/ -type f -name '*.conf' -size +10k -exec rm -f {} \;
2)将/var/log/目录下以log结尾的文件,且更改时间在7天以上的删除
find /var/log/ -name '*.log' -mtime +7 -exec rm -rf {} \;
3) 搜索条件和例子1一样,只是不删除,而是将其复制到/root/conf目录下
find ./etc/ -size +10k -type f -name '*.conf' -exec cp {} /root/conf/ \;
欢迎关注石榴姐公众号"我的SQL呀",关注我不迷路