# 文件搜索

Linux 系统中一切皆文件,所以明白如何查找文件所在是非常重要的。

# WHICH

在环境变量 $PATH 设置的目录里查找符合条件的文件。

# 语法

which [文件...]

# 常用参数

名称 描述
-n <文件名长度> 指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名
-p <文件名长度> -n 参数相同,但此处的 <文件名长度> 包括了文件的路径
-w 指定输出时栏位的宽度

# 实例

使用指令 which 查看指令 bash 的绝对路径。

which bash

# WHEREIS

在特定目录中查找符合条件的文件,它只能用于查找二进制文件、源代码文件和 man 手册页。

# 语法

whereis [-bfmsu][-B <目录>...][-M <目录>...][-S <目录>...][文件...]

# 常用参数

名称 描述
-B<目录> 只在设置的目录下查找二进制文件
-b 只查找二进制文件
-m 只查找说明文件
-s 只查找原始代码文件
-M<目录> 只在设置的目录下查找说明文件
-S<目录> 只在设置的目录下查找原始代码文件
-f 不显示文件名前的路径名称
-u 查找不包含指定类型的文件

# 实例

使用指令 whereis 查看指令 bash 的绝对路径。

whereis bash

# LOCATE

用于在保存文档和目录名称的数据库内,查找合乎范本样式条件的文档或目录。

# 语法

locate [-d ][--help][--version][范本样式...]

# 常用参数

-d--database=,用于配置 locate 指令使用的数据库。locate 指令预设的数据库位于 /var/lib/slocate 目录里,文档名为 slocate.db(有的系统为 mlocate.db 等),您可使用这个参数另行指定。

# 实例

查找 HelloWorld 文件。

locate HelloWorld

# 附加

locate 只在 /var/lib/slocate 资料库(有的系统是 /var/lib/mlocate 等)中找。

可见它并不是真的查找,而是查数据库,因此它的查找并不是实时的,而是以数据库的更新为准。如果需要手动更新数据库,可以使用下面的命令。

locate -u

数据库的更新是根据配置文件为 updatedb.conf 来进行的,所以这个配置文件也可以当作 locate 命令的配置文件。

# FIND

用来在指定目录下查找文件,任何位于参数之前的字符串都将被视为欲查找的目录名。

如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。

# 语法

find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;

# 常用参数

名称 描述
-user   name 搜索所有者为 name 的文件
-nouser 搜索没有所有者的文件,在 Linux 中除了内核产生和外来文件,其他文件都应该有所有者,否则一般可以予以删除
-type c 文件类型是 字型装置文件 的文件。(d: 目录,c: 字型装置文件,b: 区块装置文件,p: 具名贮列,f: 一般文件,l: 符号连结,s: socket)
-size n 文件大小是 nb 代表 512 位元组的区块,c 表示字元数,k 表示 kilo bytes,w 是二个位元组
-name name 文件名称符合 name 的文件
-iname name 文件名称符合 name 的文件,会忽略大小写
-empty 空的文件
-path p 路径名称符合 p 的文件
-ipath p 路径名称符合 p 的文件,会忽略大小写
-ctime n 在过去 n 天内被修改过的文件
-cmin n 在过去 n 分钟内被修改过
-atime n 在过去 n 天内被读取过的文件
-amin n 在过去 n 分钟内被读取过
-pid n Process Id 是 n 的文件

通配符:

  • 星号(*)匹配任意内容。
  • 问号(?)匹配任意一个字符。
  • 中括号([])匹配其中的一个字符。

多个条件:

  • -a 或者 and 逻辑与,表示其前后两个逻辑都需要满足。
  • -o 或者 or 逻辑或,两个条件满足一个即可。

对搜索结果进行操作:-exec <command> {} \;,其将前一个命令的结果交给 <command> 命令处理。

# 实例

将目前目录及其子目录下所有延伸档名是 py 的文件列出来。

find . -name "*.py"

查找 /var/log 目录中更改时间在 7 日以前的普通文件,并在删除之前询问它们。

find /var/log -type f -mtime +7 -ok rm {} \;

/etc 目录下查找大于 20kb 且小于 50kb 的文件。

find /etc -size +20k -a size -50k

/etc 目录下查找大于 20kb 且小于 50kb 的文件,并显示详细信息。

find /etc -size +20k -a size -50k -exec ls -l {} \;

# 总结

  • locate 只能非实时的搜索文件。
  • whereis 可以查看命令执行文件和帮助文档所在位置。
  • which 可以查看命令执行文件位置和使用了别名的命令的说明。
  • 并不是所有的命令都能找到执行文件所在位置,比如 shell 内置的命令(cd 等)。