shell编程之find/which/whereis/locate

Posted -飞鹤-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于shell编程之find/which/whereis/locate的主要内容,如果未能解决你的问题,请参考以下文章

Linux之shell编程

Linux之shell编程

Linux之shell编程

linux之shell编程基本语法

Linux之shell脚本编程

Linux之shell脚本编程