开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
由于最近一直在写解放双手系列.避免不了对shell脚本的学习.之前也是用到啥,就快速学习.解决问题.但很多都不太懂.所以,总结一下.方便以后使用.
您能在这里看到啥
- find语法理解
- find无条件查找
- find根据文件名查找
- find根据属主、属组查找
- find根据文件类型查找
- find组合查询
find语法理解
我的理解,find指令应该是实时查找工具,通过遍历->递归指定路径下的文件来完成文件的查找.简单的来说就是,顺着文件层级结构向下遍历.匹配符合查找条件的文件或者文件夹.并执行相应操作.
语法 : find [查询路径] [查询条件] [操作]
| 参数名字 | 必填 | 参数说明 |
|---|---|---|
| 查询路径 | 是 | 目标路径 |
| 查询条件 | 否 | 可以是文件名、大小、类型、权限等.默认找出目标路径下的所有文件 |
| 处理动作 | 否 | 找到目标文件后,需要做的操作.比如cp、mv、rm等等操作 |
演示前准备
-
目标路径
- 为了更好的演示,find指令的查询结果.这里统一设置当前脚本目录为目标路径.
- 获取当前脚本路径的方式如下
统一目标路径设置为project_pathproject_path=$( cd "$(dirname "$0")" || exit pwd ) echo "$project_path"
-
测试文件
- 添加测试文件,如下所示
find无条件查询
find + 查询路径find "$project_path"执行结果如下所示
无条件查询的时候,它会把当前文件夹下所有文件查找出来.符合我们上面说的遍历->递归
find根据文件名查找
-name支持通配符查找-iname不区分文件名大小写
| 需求 | 命令 | 执行结果 |
|---|---|---|
| 查找指定文件,如“test.txt” | find "$project_path" -name "test.txt" | /tst/test.txt |
查找.txt为结尾文件 | find "$project_path" -name "*.txt" | |
查找main为开头文件 | find "$project_path" -name "main*" | |
查找main为开头.js结尾的文件 | find "$project_path" -name "main*.js" | |
查找main为开头.js结尾的文件,并复制到cdn文件夹里 | find "$project_path" -name "main*.js" -exec cp {} "$cdnpath" \; | |
查找main为开头.js结尾的文件,并移动到cdn文件夹里 | find "$project_path" -name "main*.js" -exec mv {} "$cdnpath" \; | |
查找main为开头.js结尾的文件,并删除 | find "$project_path" -name "main*.js" -exec rm {} \; | |
查找main为开头文件,并删除 | find "$project_path" -name "main*" -exec rm {} \; |
由于组合操作非常的多,我这里就把我用的比较多的组合进行举例说明.方便使用者可以快速理解
find path -name的使用,不像我,还需要一个一个的尝试.也算是自己的经验总结.
find根据文件类型查找
-
语法
-type TYPE
-
TYPE
命令 说明 f 查找文件 d 查找目录文件 l 符号链接文件 s 套接字文件 b 块设备文件 c 字符设备文件 p 管道文件 -
使用事例 | 需求 | 命令 | | --- | --- | |查找文件|
find "$project_path" -type f| |查找文件夹|find "$project_path" -type d| |查找目录并列出目录下的文件|find "$project_path" -type d -exec ls {} \;|
find根据属主、属组查找
| 命令 | 说明 |
|---|---|
| -user | 查找属主为指定用户的文件 |
| -group | 查找属组为指定用户的文件 |
| -uid | 查找属主为指定uid的文件 |
| -gid | 查找属组为指定GID用户的文件 |
| -nouser | 查找没有属主的文件 |
| -nogrroup | 查找没有属组的文件 |
属主、属组.确实不太了解.下面我们就看一下怎么查看属主和属组吧
-
查看
ts.sh文件权限和归属ls -l ts.sh-rw-r--r--@ 1 hm staff 638 11 23 15:23 ts.sh-代表文件类型rw-代表属主的权限r--代表属组的权限r--代表其他的权限hm代表属主staff代表属组 - 这样我们就获取到了
ts.sh文件的属主了 - 查找属主是
hm的文件find "$project_path" -type f -user hm
find组合查询
-
组合条件
- 与: -a
- 或: -o
- 非: -not或者 !
-
使用事例
需求 命令 查找 c开头并且是文件夹find "$project_path" -name "c*" -a -type d查找 .txt或.js文件find "$project_path" -name "*.js" -o -name "*.txt"查找不是 .txtfind "$project_path" -not -name "*.txt"查找不是 .txtfind "$project_path" ! -name "*.txt"