文件查找find+xargs

 # 一、文件查找

## 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={}
```

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值