目录

【Linux】文件搜索

在Linux中,查找文件的方法有很多,现在介绍常见的几个工具。

locate

这是较为简单的文件搜索命令。

locate命令通过快速搜索数据库,从而找到路径名与给定字符串相匹配的文件,并输出结果。

命令格式

命令格式如下:

1
locate [options] [pattern]

options

常见的选项如下:

  • -A: -all,只输出同时匹配所有模式的文件。默认情况下,文件只要匹配某个模式就会被打印。

  • -V: 打印版本信息。

pattern

搜索时,不要求文件和模式完全匹配,即搜索支持通配符。

数据库

linux系统中通常会开启一个定时任务,然后每隔一段时间执行一次updatedb程序命令,从而生成新的数据库文件。locate搜索时,会在这个数据库文件中进行查找。

linux系统中的数据库通常位于/var/lib/mlocate/mlocate.db

locate搜索到的结果,并不一定是当前的最新的文件。如果想获得最新的结果,可以切换到root用户,并执行updatedb

find

find命令除了可以根据文件名搜索文件外,还可以根据各种属性进行文件查找,其支持的特性非常丰富。

命令格式

find的命令格式如下:

1
find [path] [options] [expression]

如果省略path,则默认在当前目录下搜索。

常见选项参数

常见的选项为:

  • -cmin

    后跟参数:

    • n: n分钟前的那个时刻,内容或属性改变的文件或目录。

    • +n: 超过n分钟。

    • -n: 不足n分钟。

  • -cnewer file

    内容或属性的修改时间晚于file的文件或目录。

  • -ctime

    后跟参数:

    • n: n*24小时前的那个时刻,内容或属性发生改变的文件或目录。

    • +n: 超过n*24小时。

    • -n: 不足n*24小时。

  • -empty

    匹配空文件或空目录。

  • -group name

    匹配属于name组的文件或目录,name可以是组名,或者组ID。

  • -name pattern

    和通配符匹配的文件或目录。

  • -iname pattern

    -name类似,只是文件或目录不区分大小写。

  • -inum n

    匹配索引节点是n的文件,通常用于查找硬连接。

  • -mmin

    后跟参数:

    • n: n分钟前的那个时刻,内容被修改的文件或目录。

    • +n: 超过n分钟。

    • -n: 不足n分钟。

  • -mtime

    后跟参数:

    • n: n*24小时前的那个时刻,内容被修改的文件或目录。

    • -n: 不足n小时。

    • +n: 超过n小时。

  • -newer file

    匹配内容的修改时间晚于file的文件或目录。

  • -nouser

    匹配不属于有效用户的文件或目录。当用户被删除时,该命令可以用于删除无用文件。

  • -nogroup

    匹配不属于有效用户组的文件或目录。

  • -perm mode

    与指定权限匹配的文件或目录。

  • -samefile file

    -inum类似,匹配与file具有相同inode的文件。

  • -size

    后跟参数:

    • n: 匹配大小等于n的文件或目录。

    • +n: 匹配大小超过n的文件或目录。

    • -n: 匹配大小不足n的文件或目录。

    n的计量单位可以是:

    • b: 512字节的块。

    • c: 字节,如-size 1c

    • w: 两个字节的字。

    • k: KB。

    • M: MB。

    • G: GB。

  • -type t

    匹配t类型的目标。t可以是:

    • b: 块设备文件。

    • c: 字符设备文件

    • d: 目录。

    • f: 普通文件。

    • l: 符号链接。

  • -user name

    匹配属于name用户的文件或目录,name可以是用户名,或者用户ID。

逻辑操作

逻辑操作也是options中的一种。

  • -and:将多个检验条件以“逻辑与”的关系组合起来,表示“逻辑与”的关系时,可以省略该操作符。简写为-a

  • -or:将多个检验条件以“逻辑或”的关系组合起来,简写为-o

  • -not:匹配使该操作符之后的条件为假的文件或目录。

  • ():默认情况下,find命令从左向右进行运算,而括号()可以改变运算优先级。通常()前需要使用引号或者反斜线,如\(\)

逻辑操作符采用惰性运算,即如果操作符左边的条件能确定最终结果,就不再执行右边的操作。

其他选项

find命令还有一些其他的常见选项:

  • -depth:要求find先处理完文件,再处理目录。

  • -mindepth levels:从该层级的子目录开始搜索。

  • -maxdepth levels:搜索的最大子目录层级。

  • -mount:不去遍历挂载在其他文件系统上的目录。

  • -noleaf:要求find程序不要以“正在搜索类UNIX文件系统“为假设来优化搜索,在DOS/Windows系统上会用到该选项。

path

如果省略path,则默认在当前目录下搜索。

expression

找到文件后,就可以根据expression对文件进行处理了。

find中有一些预定义的动作:

  • -delete:删除匹配文件。

  • -ls:以标准格式输出匹配文件。

  • -print:输出匹配文件,默认情况下就是执行该操作。

  • -quit:一旦匹配成功就退出。

find还可以根据需要自定义动作,自定义方法为:

1
2
3
4
5
-exec [commands] {} [commands] ;

# {} 表示被匹配的文件
# ; 需要使用引号或者反斜线来进行转义
# -ok 作用类似于-exec,只是执行命令前会询问用户

上述方法会对每个匹配文件执行一遍自定义命令,如果只想对所有匹配文件执行一次命令,可以使用下述方法:

1
2
3
4
5
-exec [commands] {} [commands] +

# 或者

find [options] [path] [expression] | xargs commands

whereis

whereis用来查找满足条件的二进制文件、帮助文件和源代码文件。

具体用法

用法为:

1
whereis [options] 文件

常见选项

  • -b:只搜索二进制文件。

  • -B <目录>:指定二进制文件搜索路径。

  • -m:只搜索man帮助文档。

  • -M <目录>:指定帮助文档搜索路径。

  • -s:只搜索源代码文件。

  • -S <目录>:指定源代码文件搜索路径。

  • -l:输出有效查找路径。

文件分类方式

whereis有一套自己的文件搜索方式,它规定了二进制文件、帮助文档或者源代码文件的搜索目录。

使用whereis -l即可查看具体搜索路径。

which

which用于在PATH路径中查找可执行程序,并输出具体路径。如:

1
which ls # /usr/bin/ls

总结

以上就是Linux中较为常见的文件搜索工具,各自无优劣之分,可以根据需要选择合适的使用。