shell 通用命令之find

319 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

由于最近一直在写解放双手系列.避免不了对shell脚本的学习.之前也是用到啥,就快速学习.解决问题.但很多都不太懂.所以,总结一下.方便以后使用.

您能在这里看到啥

  1. find语法理解
  2. find无条件查找
  3. find根据文件名查找
  4. find根据属主、属组查找
  5. find根据文件类型查找
  6. find组合查询

find语法理解

我的理解,find指令应该是实时查找工具,通过遍历->递归指定路径下的文件来完成文件的查找.简单的来说就是,顺着文件层级结构向下遍历.匹配符合查找条件的文件或者文件夹.并执行相应操作.

语法 : find [查询路径] [查询条件] [操作]

参数名字必填参数说明
查询路径目标路径
查询条件可以是文件名、大小、类型、权限等.默认找出目标路径下的所有文件
处理动作找到目标文件后,需要做的操作.比如cpmvrm等等操作

演示前准备

  1. 目标路径

    • 为了更好的演示,find指令的查询结果.这里统一设置当前脚本目录为目标路径.
    • 获取当前脚本路径的方式如下
       project_path=$(
           cd "$(dirname "$0")" || exit
           pwd
       )
       echo "$project_path"
      
      统一目标路径设置为project_path
  2. 测试文件

    • 添加测试文件,如下所示

    截屏2022-11-23 10.57.04.png

find无条件查询

  • find + 查询路径
    • find "$project_path"执行结果如下所示 截屏2022-11-23 10.58.28.png

    无条件查询的时候,它会把当前文件夹下所有文件查找出来.符合我们上面说的遍历->递归

find根据文件名查找

  1. -name 支持通配符查找
  2. -iname 不区分文件名大小写
需求命令执行结果
查找指定文件,如“test.txt”find "$project_path" -name "test.txt"/tst/test.txt
查找.txt为结尾文件find "$project_path" -name "*.txt"截屏2022-11-23 10.52.23.png
查找main为开头文件find "$project_path" -name "main*"截屏2022-11-23 10.54.13.png
查找main为开头.js结尾的文件find "$project_path" -name "main*.js"截屏2022-11-23 10.55.17.png
查找main为开头.js结尾的文件,并复制到cdn文件夹里find "$project_path" -name "main*.js" -exec cp {} "$cdnpath" \;截屏2022-11-23 11.03.34.png
查找main为开头.js结尾的文件,并移动到cdn文件夹里find "$project_path" -name "main*.js" -exec mv {} "$cdnpath" \;截屏2022-11-23 11.04.56.png
查找main为开头.js结尾的文件,并删除find "$project_path" -name "main*.js" -exec rm {} \;截屏2022-11-23 11.10.54.png
查找main为开头文件,并删除find "$project_path" -name "main*" -exec rm {} \;截屏2022-11-23 11.09.52.png

由于组合操作非常的多,我这里就把我用的比较多的组合进行举例说明.方便使用者可以快速理解 find path -name的使用,不像我,还需要一个一个的尝试.也算是自己的经验总结.

find根据文件类型查找

  1. 语法

    • -type TYPE
  2. TYPE

    命令说明
    f查找文件
    d查找目录文件
    l符号链接文件
    s套接字文件
    b块设备文件
    c字符设备文件
    p管道文件
  3. 使用事例 | 需求 | 命令 | | --- | --- | |查找文件|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组合查询

  1. 组合条件

    • 与: -a
    • 或: -o
    • 非: -not或者 !
  2. 使用事例

    需求命令
    查找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"

系列文章

参考文章

Shell find 命令详解