• shell编程之find/which/whereis/locate


    1. 前言

    查找是非常常用的功能,Linux下提供了4个小工具,用来提供查找功能。它们分别为:find、which、whereis、locate,其查找功能各有侧重点,可以根据使用的场景来选择合适的工具程序。

    2. find

    2.1. 语法:

    find [-H] [-L] [-P] [-Olevel] [-D debugopts] [path…] [expression]

    在目录层级中搜索文件。
    path默认为当前目录,expression默认为打印找到的文件信息。

    • -H,除指定软连接目录,否则不搜索路径中软连接下的信息。
    • -L, 搜索路径中软连接下的信息。
    • -P,不搜索软连接下的信息,此选项为默认设置。
    • -O,优化搜索速度,共4级,分别为0,1,2和3。
    • -D,开启Debug分析异常,详见find -D help。
    • path…,路径组,指定需要搜索的路径。
    • expression,指定查找规则,Tests、Actions、Global options、Positional options、Operators。

    2.2. expression

    2.2.1. Positional

    位置选项,它们影响命令行后后面的测试。

    2.2.1.1. -daystart

    以今天起始时间为标准来衡量。

    • -atime,在指定天时间访问过的文件。
    • -ctime,在指定天时间状态信息改变过的文件。
    • -mtime, 在指定天时间内容修改过的文件。
    • -amin,在指定分钟访问过的文件。
    • -cmin,在指定分钟状态信息改变过的文件。
    • -mmin, 在指定分钟内容修改过的文件。
    # 在30分钟前内容修改过的文件
    find ./ -name '.cpp" -mmin -30
    # 在30天内访问过的文件
    find ./ -name '.cpp" -atime -30
    # 在30天整时状态发生谈过的文件
    find ./ -name '.cpp" -ctime 30
    
    2.2.1.2. -regex

    查找符合正则表达式的文件。

    # 查找所有以"course"开头的子目录,但是他们下一个版本
    find test -type d -regex '.*/course[0-9.]*'
    

    2.2.2. Global Options

    为了防止歧义,全局选项应该放在位置选项后,放在测试选项前。

    • -d,指定先搜索文件再搜索文件夹。
    • -help,输出用法信息。
    • -maxdepth,指定最大文件夹搜索层数。
    • -mindepth,指定最小文件夹搜索层数。
    • -version,输入版本信息。
    • -xdv,不进入其他文件系统的文件夹。

    2.2.3. Operators

    运算符主要是完成逻辑操作,形式为:逻辑非“!”、逻辑或“-o”、逻辑与“-a”。

    • 逻辑非
    # 表示检索当前目录下,不属于root用户的文件
    find . ! -user root
    
    • 逻辑或
    # 表示检索根目录下超过30天没有访问的,文件扩展名为.o或者文件名为a.out的所有文件。
    # “\(“转义字符加个特殊符号,防止shell对其进行了解析
    find /  −name ‘∗.o′ −o −namea.out -atime +30
    
    • 逻辑与
    # 表示检索根目录下的属于book用户的所有子目录
    find / -type d -a -user book
    

    2.2.4. Tests

    比较测试。

    # 在当前目录指定搜索文件名
    find . -name abc.txt
    # 在当前目录指定搜索文件名,大小写不敏感
    find . -iname abc.txt
    # 在当前目录指定inode搜索
    find . -inum 543886
    # 在当前目录搜索所有abc开头的文件
    find . -name "abc*"
    # 搜索23字节的文件
    find . -size 23c
    # 搜索一个大于10MB的文件
    find . -size +10M
    # 搜索一个小于10字节的文件
    find . -size -10c
    # 搜索指定权限的文件
    find . -perm 777
    # 搜索root用户权限的文件
    find . -user root
    # 搜索以m开头的目录
    find . -type d -name "m*"
    # 搜索以m开头的文件
    find . -type f -name "m*"
    # 搜索软件链接文件
    find . -type l  
    # 搜索空文件
    find ./ -empty
    

    2.2.5. Actions

    搜索到目标之后,执行指定的动作。

    # 删除以.obj结尾的文件
    find . -name "*.obj" -delete
    # 删除以.obj结尾的文件,会提示确认
    find . -name "*.obj" -ok rm {} \;
    # 删除以.obj结尾的文件
    find . -name "*.js" -exec rm {} \;
    # 查找系统中所有文件长度为 0 的普通文件,并列出它们的完整路径:
    find / -type f -size 0 -exec ls -l {} \;
    # 列出所有o结尾的文件详细信息
    # find . -name "*.o" -ls
    

    3. which

    which是搜索环境目录中(通常是usr/bin)中的可执行文件,并返回第一个满足要求的完整路径。

    which gcc
    #输出:/usr/bin/gcc
    

    4. whereis

    4.1. 语法

    whereis [options] [-BMS

    … -f]

    主要是搜索所有的可执行文件、帮助文档。

    • options
      – -b,指定搜索可执行二进制文件。
      – -m, 指定搜索帮助手册。
      – -s, 指定搜索资源代码文件。
      – -l, 显示所有搜索过的路径。
      -BMS是限定在指定目录中搜索相应的文件。

    4.2. 示例

    # 显示所有的gcc的路径
    whereis -b gcc
    # 显示所有gcc相关的可执行文件,帮助文档,资源
    whereis -bms gcc
    whereis gcc
    # 只在/usr/bin目录搜索可执行文件,可以在其他目录搜索帮助手册和代码。
    whereis -B /usr/bin -f gcc
    # 
    

    4. locate

    4.1. 介绍

    locate不是Linux自带的搜索工具,需要安装。其主要功能是通过先索引文件信息到数据库,再来搜索文件信息。

    sudo apt install mlocate

    安装完之后,locate工具会搜索所有文件,建立索引数据库以提高搜索速度。
    locate默认每24小时更新一次数据库。也可以手动更新:

    sudo updatedb

    4.2. 用法

    • 语法

    Usage: locate [OPTION]… [PATTERN]…

    短标识长标识作用
    -A,–all仅打印满足全部模式的条目
    -b,–basename仅匹配文件名
    -c,–count打印匹配的条目数
    -d,–database DBPATH指定DBPATH代替默认的数据库
    -e,–existing仅打印当前存在的文件条目
    -L,–follow追踪软链接
    -h,–help输出帮助信息
    -i,–ignore-case忽略大小写
    -p,–ignore-spaces忽略符号和空格
    -t,–transliterate忽略重音
    -l,–limit, -n LIMIT限制输出数
    -P,–nofollow, -H不跟踪软链接
    -0,–null用空来分隔输出
    -S,–statistics打印数据库已经使用的统计信息
    -q,–quiet不报告有关读取数据库的错误信息
    -r,–regexp --regex利用正则表达式搜索
    -V,–version打印版本信息
    -w,–wholename匹配完整路径名(默认)

    4.3. 示例

    # 查找所有路径包括gcc的的文件目录
    locate gcc
    # 查找文件名包括gcc的
    locate -b gcc
    # 查找所有文件名为gcc的文件
    locate -r /gcc$
    # 手动更新数据库索引
    updatedb
    
  • 相关阅读:
    门禁管理:这招我居然才知道,不要太好用!
    一个快速切换浏览器搜索引擎的小技巧(在地址栏搜索B站、书签等的方法)
    人间道-您到底做错了什么:正心径之您要逐渐去除外邪行为
    【虚拟化】KVM
    HUST-OJ运用经验
    vue.js+node.js+mysql在线聊天室源码
    C语言描述数据结构 —— 常见排序(1)直接插入排序、希尔排序、选择排序、堆排序
    Ansible教程
    Redis未授权访问漏洞实战
    全闪存引领SDS革新换代
  • 原文地址:https://blog.csdn.net/feihe027/article/details/126963796