# 一、文件查找
## 1 find
find 是实时查找工具,通过遍历指定路径完成文件查找
工作特点:
- 查找速度略慢
- 精确查找,模糊查找
- 实时查找
- 查找条件丰富
- **只能搜索执行命令用户具备读取和执行权限的目录**
`find`命令格式
```cs
find [参数] [搜索路径] [搜索条件] [处理动作]
搜索路径: 是指从哪个目录路径下开始搜索,默认为当前所在目录
搜索条件: 可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
处理动作: 对符合条件的文件做操作,默认输出至屏幕相对路径
```
### 1.2.1 指定搜索目录层级
参数如下:
```css
find -maxdepth 2 指定最大递归搜索到第几层子目录,当前目录为1
find -mindepth 2 最小搜索层级,也就是从当前目录2层子目录以下进行搜索
面试题
find -maxdepth 2 -mindepth 2 表示只搜索当前目录第2层级的子目录和文件
```
### 2.根据文件名和inode查找
参数如下
```css
find -name filename 默认精确查找,如:*, ?, [], [^],通配符要加双引号引起来
find -ls 显示符合条件文件目录属性信息
find -iname filename 忽略文件名大小写
find -inum n 按inode号查找文件
find -samefile filename 通过指定文件相同inode号的文件
find -links n 链接数为n的文件
find -regex “PATTERN” 支持正则表达式,以PATTERN匹配整个文件路径,而非文件名称
```
### 3.根据属主属组查找
参数如下
```css
find -user <USERNAME> 查找属主为指定用户(UID)的文件
find -group <GRPNAME> 查找属组为指定组(GID)的文件
find -uid <UserID> 查找属主为指定的UID号的文件
find -gid <GroupID> 查找属组为指定的GID号的文件
find -nouser 查找没有属主的文件
find -nogroup 查找没有属组的文件
```
### 4. 根据文件类型查找
参数如下
```http
find -type [文件类型]
支持文件类型如下
f 普通文件
d 目录文件
l 符号链接文件
s 套接字文件
b 块设备文件
c 字符设备文件
p 管道文件
```
### 5. 查找空文件或目录
参数如下
```
find -empty 查找指定目录下空文件和空目录
```
### 6. 组合条件
把多个条件进行组合查找
```
-a 多个条件与的关系,默认参数
-o 多个条件或者关系
-not 或者 ! 查找非条件以外的文件
```
摩根定律:
(非 A) 或 (非 B) = 非(A 且 B)
(非 A) 且 (非 B) = 非(A 或 B)
**注意:使用小括号时,必须有空格隔开,而且需要`\`转义**
### 7.排除指定目录
参数如下
```
find -path [指定目录] -a -prune -o [其他条件] 指定目录通过-prune参数裁剪掉,移除
```
### 8.根据文件大小查找
参数如下
```css
find -size [+/-][大小munber] 按照指定大小范围查找文件
常用大小单位: byte, c(小写), k(小写), M(大写), G(大写),注意字母大小写,默认查找大小单位为 "k"
find -size [munber] 查找文件大小范围为 (munber -1 , munber]
find -size 5k 查找文件大小范围为 (4,5]k
find -size -[munber] 查找文件大小范围为 [0 , munber -1]
find -size -5k 查找文件大小范围为 [0,4]k
find -size +[munber] 查找文件大小范围为 ( munber , 无穷]
find -size +5k 查找文件大小范围为 (5,无穷]k
```
面试题:查找大于等于100M的文件
find / -type f \( -size +100M -o -size 100*1024*1024 \)
### 9.根据时间查找
参数如下
```sh
以"天"为单位
find -atime [+ / - ]day
find -mtime [+ / - ]day
find -ctime [+ / - ]day
以"分钟"为单位
find -amin [+ / - ]min
find -mmin [+ / - ]min
find -cmin [+ / - ]min
范例: 当前日期为date
find -ctime 7 表示查找前第7天,当前日期为0开始算,也就是date-day
find -ctime 0 表示查找当前一天的文件
find -ctime +7 表示查看前7天以前的文件不包括第7天,也就是[0,date-day)
find -ctime -7 表示查看最近7天修改的文件,从当前天为-1开始算,也是就是(date-day, date]
```
### 10.根据文件权限查找
参数如下
```sh
find -perm [/|-]MODE
find -perm MODE 精确权限匹配
find -perm /MODE 任何一类(u,g,o)对象的权限中只要能一位匹配即可,或的关系,+ 从CentOS 7开始淘汰
find -perm -MODE 每一类对象都必须同时拥有指定权限,与关系
0 表示没有权限
```
范例(细品)
```
find -perm 222 精确匹配文件权限必须是222
find -perm /222 表示只要文件的属主有写权限,"或者"属组有写权限,其他用户随意都匹配
find -perm -222 表示只要文件的属主有写权限,"而且"属组有写权限,其他用户也有写权限
find -perm /7000 表示文件只要有一个特殊权限即可
```
### 11. find处理动作
处理动作参数如下
```sh
find -print #find命令默认处理动作参数,把查找文件打印的屏幕上
find -ls #类似于对查找到的文件执行“ls -l”命令
find -fls PATH #查找到的所有文件的长格式信息保存至指定文件中,相当于 -ls > file
find -delete #删除查找到的文件,不做任何提示,"慎用!"
find -ok COMMAND {} \; #对查找到的每个文件执行由COMMAND指定的命令处理,对于每个文件执行命令之前,"都会交互式要求用户确认"
find -exec COMMAND {} \; #对查找到的每个文件执行由COMMAND指定的命令处理
find命令中"{}"表示引用查找到的文件名称自身,"注意: -ok参数和-exec参数后面必须跟 \;"
```
## .3 xargs
由于很多命令不支持管道`|`来传递参数,`xargs`用于产生某个命令的参数,`xargs`可以读入 stdin 的数据,并且以空格符或回车符将 stdin 的数据分隔成为参数。另外,许多命令不能接受过多参数,命令执行可能会失败,`xargs` 可以解决
`xargs`命令参数
```css
xargs 默认把多行信息转化为一行显示
[root@centos7 /data ]# seq 10|xargs
1 2 3 4 5 6 7 8 9 10
xargs -n 指定接收信息以几行为一行显示
[root@centos7 /data ]# seq 10|xargs -n2
1 2
3 4
5 6
7 8
9 10
xargs -d 定义分割符
[root@centos7 /data ]# echo "nameXnameXnameXname" | xargs -dX
name name name name
xargs -i 配合{}改变xargs传入参数位置
比如: 移动文件格式是 mv 文件 移动目标目录,xargs默认把参数传入命令最后
cd /etc/ && find -name '*.conf' | xargs -i cp {} /data/
xargs -p 交互式执行命令
[root@centos7 /data ]# seq 10| xargs -p -i echo {} a
echo 1 a ?...y
1 a
echo 2 a ?...y
2 a
```
范例
```
批量创建用户
echo user{1..10}|xargs -n1 useradd
批量删除用户
echo user{1..10}|xargs -n1 userdel -r
场景: 系统创建文件,文件名可以带有空格,利用find命令查找无法删除
[root@centos7 /data ]# ls
1 2.txt a b.txt
[root@centos7 /data ]# ll
-rw-r--r--. 1 root root 0 Apr 24 16:52 1 2.txt
-rw-r--r--. 1 root root 0 Apr 24 16:52 a b.txt
[root@centos7 /data ]# find -type f -name "*.txt"|xargs rm
rm: cannot remove ‘./a’: No such file or directory
rm: cannot remove ‘b.txt’: No such file or directory
rm: cannot remove ‘./1’: No such file or directory
rm: cannot remove ‘2.txt’: No such file or directory
原因是rm命令认为 a 是一个文件 b.txt 是一个文件
解决方式:find -print0 参数会把换行符替换为一个特殊字符,配合xargs -0
find -type f -name "*.txt" -print0|xargs -0 rm
并发执行多个进程下载网页 xargs -P
seq 100 |xargs -i -P10 wget -P /data http://10.0.0.8/{}.html
并发下载哔哩哔哩视频
yum install -y python3-pip
pip3 install you-get
seq 10 | xargs -i -P3 you-get https://www.bilibili.com/video/BV14K411W7UF?p={}
```