# Find<no value>

#### 语法
请不要输入`[]`
```systemd
find [路径] [匹配条件] [动作]
```

### 使用
#### 查找指定文件名
例:要找 hello.txt
```systemd
find ./ -name "hello.txt"
```

如果要不区分英文大小写，可以用 -iname 这个选项
```systemd
find ./ -iname "hello.txt"
```
这样不管是 hello.txt 或 Hello.txt 或 HELLO.txt 都可以找得出来，

#### 查找包含关键字的文件或目录
例:查找包含`README`的文件或目录
```systemd
find ./ -name "*README*"
```

例:查找包含`README`的文件
```systemd
find ./ -name "*README*" -type f
```

例:查找包含`README`的目录
```systemd
find ./ -name "*README*" -type d
```

#### Find 找到特定文件后，并且移动mv这些文件
把当前目录有 "Star" 关键字档名移动到 bar 资料夹
```systemd
find ./ -name "*Star*" -type f | xargs -i mv {} bar
```

如果找到的文件名称包含空白需加上 -print0
```systemd
find ./ -name "*Star*" -type f -print0 | xargs -0 -i mv {} bar
```

#### Find 找到特定文件后，并且移动复制cp这些文件
把当前目录有 "Star" 关键字档名复制到 bar 资料夹
```systemd
find ./ -name "*Star*" -type f | xargs -i cp {} bar
```

#### Find 找到特定文件后，并且移动删除rm这些文件
把当前目录有 "Star" 关键字档名给删除
```systemd
find ./ -name "*Star*" -type f | xargs rm
```

找到 *.md 文件 并删掉(文件名称有空白或太长要加 -print0 选项)
```systemd
find /site -name "*.zh-tw.md" -type f -print0 | xargs -0 rm
```


#### Find 找到特定文件后，并且搜寻grep这些文件内的文字
把当前目录 tif 档中的 "main" 关键字找出来
```systemd
find ./ -name "*.tif" -print0 | xargs -0 grep -r "main" --color
find ./ -name "*.tif" -print0 | xargs -0 ag "main"
```

将两类别关键字的文件 (*.tif 档和 *.h 档) 找出来进行搜寻
```systemd
find ./ \( -name "*.tif" -o -name "*.h" \) -print0 | xargs -0 grep "stdio"
find ./ \( -name "*.tif" -o -name "*.h" \) -print0 | xargs -0 ag "stdio"
```

找出执行档类型
```systemd
find -type f -executable -exec file -i '{}' \; | grep 'x-executable; charset=binary'
```

根据上例子，找到特定文件后，并且搜寻 grep 这些文件内的文字，假如有搜寻到特定文字的话在作移动mv / 复制cp / 删除rm这些文件，这是进阶中的进阶技巧了！
把当前目录 tif 档内容中包含 "main" 关键字的文件找出来后移动mv文件到 out 资料夹
```systemd
find ./ -name "*.tif" -print0 | xargs -0 grep -rIl "main" | xargs -i mv {} out
```

把当前目录 tif 档内容中包含 "main" 关键字的文件找出来后复制cp文件到 out 资料夹
```systemd
find ./ -name "*.tif" -print0 | xargs -0 grep -rIl "main" | xargs -i cp {} out
```

把当前目录 tif 档内容中包含 "main" 关键字的文件找出来后删除rm
```systemd
find ./ -name "*.tif" -print0 | xargs -0 grep -rIl "main" | xargs rm
```


#### Find 找到特定文件后，并且取代sed这些文件内的文字
例:把当前目录 tif 文件找出来后用sed将文件内容的 "Star" 取代成 "bar"
```systemd
find ./ -name "*.tif" -print0 | xargs -0 sed -i 's/Star/bar/g'
```

#### Find 根据文件大小来找
找出大于500M的文件
```systemd
find ./ -size +500M
```

找出大于2G的文件
```systemd
find ./ -size +2G
```
or
```systemd
find ./ -size +2048M
```

找出小于160k的`jpg`照片并且删除
```systemd
find ./ -name "*.jpg" -size -160k -delete
```

找出大于160k的`jpg`照片并且删除
```systemd
find ./ -name "*.jpg" -size +160k -delete
```

其他单位使用
c：for bytes
k：for Kilobytes (units of 1024 bytes)
M：for Megabytes (units of 1048576 bytes)
G：for Gigabytes (units of 1073741824 bytes)


#### Find 根据文件修改日期来找
用 find 指令寻找当前目录下在 5 分钟以内变动过的所有文件
```systemd
find ./ -type f -mmin -5
```

用 find 指令寻找当前目录下超过 5 分钟以上变动过的所有文件，同时也是 5 分钟内没有变动过的所有文件
```systemd
find ./ -type f -mmin +5
```

用 find 指令寻找当前目录下最后 5 分钟到 10 分钟内变动过的所有文件，
```systemd
find ./ -type f -mmin +5 -mmin -10
```

用 find 指令寻找当前目录下 3 天内变动过的所有文件，
```systemd
find ./ -type f -mtime -3
```

几个选项的差异
amin：文件的最后存取时间(last access)，时间单位为分钟
atime：文件的最后存取时间(last access)，时间单位为天
cmin：文件的状态资讯最后修改的时间(last change)，时间单位为分钟
ctime：文件的状态资讯最后修改的时间(last change)，时间单位为天
mmin：文件的最后修改时间(last modify)，时间单位为分钟
mtime：文件的最后修改时间(last modify)，时间单位为天

#### Find排除目录
find 排除单个目录
例:排除单一目录，假如 find txt 文字档时要排除当前 test 目录，指令如下:
```systemd
find ./ -name "*.txt" -path "./test" -prune -o -print
```

find 排除多个目录
例:排除当前 test 与 tools 目录，指令如下:
```systemd
find ./ -name "*.txt" -path "./test" -prune -o -path "./tools" -prune -o -print
```
排除 2 个以上目录的指令就依此类推

#### Find 计算找到的文件数量
如果想要计算 find 找到文件结果的数量的话可以配合 wc 这个指令，这边示范找当前目录下副档名为 jpg 的文件数量
```systemd
find ./ -name "*.jpg" | wc -l
```


