# 文件搜索
在 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 | 文件大小是 n ,b 代表 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 等)。