which whereis locate
which 查看可执行文件的位置。
whereis 查看文件的位置。
locate 配合数据库查看文件位置。
which
查找环境变量中的文件
which 命令用于查找并显示给定命令的绝对路径,环境变量 PATH 中保存了查找命令时需要遍历的目录。which 指令会在环境变量 $PATH 设置的目录里查找符合条件的文件。也就是说,使用 which 命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。
参数
参数:
- -n<文件名长度> 指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名。
- -p<文件名长度> 与-n参数相同,但此处的<文件名长度>包括了文件的路径。
- -w 指定输出时栏位的宽度。
- -V 显示版本信息。
- --skip-dot 跳过 PATH 中以点开头的目录
- --skip-tilde 跳过 PATH 中以波形符号开头的目录
- --show-dot 不要在输出中将点扩展到当前目录
- --show-tilde 为 HOME 目录(非根目录)输出波形
- --tty-only 如果不在 tty 上,停止右边的处理选项
- --all, -a 打印 PATH 中的所有匹配项,而不仅仅是第一个
- --read-alias, -i 从 stdin 中读取别名列表
- --skip-alias 忽略选项 --read-alias;不读 stdin
- --read-functions 从 stdin 读取 shell 函数
- --skip-functions 忽略选项 --read-functions;不读 stdin
实际用法
- 显示命令的路径
[root@honey-master ~] which bash /usr/bin/bash [root@honey-master ~] which pwd /usr/bin/pwd [root@honey-master ~] which java /usr/bin/java [root@honey-master ~] which python3 /usr/bin/python3 [root@honey-master ~] which cd /usr/bin/cd
which 是根据使用者所配置的 PATH 变量内的目录去搜寻可运行文档的,所以,不同的 PATH 配置内容所找到的命令当然不一样的。
- 显示命令的别名
[root@honey-master ~] which ls alias ls='ls --color=auto' /usr/bin/ls [root@honey-master ~] which which alias which='(alias; declare -f) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot' /usr/bin/which
- 使用别名也依然可以完成同样的操作
[root@honey-master ~] ls --color=auto /etc DIR_COLORS chrony.conf dnsmasq.conf glvnd issue.d localtime nanorc pkcs11 rc6.d shells tuned [root@honey-master ~] (alias; declare -f) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot ls alias ls='ls --color=auto' /usr/bin/ls
whereis
Linux whereis命令用于查找文件。
该指令会在特定目录中查找符合条件的文件。这些文件应属于原始代码、二进制文件,或是帮助文件。
该指令只能用于查找二进制文件、源代码文件和man手册页,一般文件的定位需使用locate命令。
语法
whereis [-bfmsu][-B <目录>...][-M <目录>...][-S <目录>...][文件...]
参数
此格式中,用 [] 括起来的都是可选选项,其中各个参数的含义分别是:
- -b:只查找二进制文件。
- -B 目录:只在指定的目录下查找二进制文件。
- -m:只查找说明文件。
- -M 目录:只在指定的目录下查找说明文件。
- -s:只查找原始代码文件。
- -S 目录:只在指定的目录下查找原始代码文件。
- -u:查找不包含指定类型的文件。
- -f:不显示文件名前的路径名称。
这是这一命令的 man 页面给出的解释:
whereis 可以查找指定命令的二进制文件、源文件和帮助文件。 被找到的文件在显示时,会去掉主路径名,然后再去掉文件的(单个)尾部扩展名 (如: .c),来源于源代码控制的 s. 前缀也会被去掉。接下来,whereis 会尝试在标准的 Linux 位置里寻找具体程序,也会在由 PATH和PATH和MANPATH 指定的路径中寻找。
[root@honey-master etc] whereis bash bash: /usr/bin/bash /usr/share/man/man1/bash.1.gz /usr/share/info/bash.info.gz
需要注意的是,输出的第一个路径才是你想要的结果。使用 whereis 命令,同时也会显示帮助页面和源码所在路径。(如果能找到的情况下会显示,但是在这一例中没有找到)所以你在输出中看见的第二个路径就是帮助页面文件所在位置。
实例
- 如果你想只搜索,假设说,二进制文件,你可以使用 -b 这一命令行选项。
[root@honey-master etc] whereis -b bash bash: /usr/bin/bash
- 只查找说明文件
[root@honey-master etc] whereis -m bash bash: /usr/share/man/man1/bash.1.gz /usr/share/info/bash.info.gz
- 默认情况下,whereis 是从由匹配符所定义的硬编码路径来寻找文件的。但如果你想的话,你可以用命令行选项来限制搜索。例如,如果你只想在 /usr/bin 寻找二进制文件,你可以用 -B 这一选项来实现。
[root@honey-master etc] whereis -B /usr/bin/ -f cp cp: /usr/share/man/man1/cp.1.gz /usr/share/man/man1p/cp.1p.gz /usr/bin/cp
- 注意:使用这种方式时可以给出多个路径。使用 -f 这一选项来明确分隔目录列表和要搜索的文件名。
- 查看whereis的搜索路径
[root@honey-master etc] whereis -l bin: /usr/bin bin: /usr/sbin bin: /usr/lib bin: /usr/lib64 bin: /etc ...
- 对于 whereis 命令来说,如果一个命令对每个显式的请求类型都不止一项,则该命令被视为异常。例如,没有可用文档的命令,或者对应文档分散在各处的命令都可以算作异常命令。 当使用 -u 这一选项,whereis 就会显示那些有异常条目的命令。
例如,下面这一例子就显示,在当前目录中,没有对应文档或有多个文档的命令。
[root@honey-master etc] whereis -m -u * at: /usr/share/man/man1/at.1.gz /usr/share/man/man1p/at.1p.gz crontab: /usr/share/man/man1/crontab.1.gz /usr/share/man/man1p/crontab.1p.gz /usr/share/man/man5/crontab.5.gz dconf: /usr/share/man/man1/dconf.1.gz /usr/share/man/man7/dconf.7.gz gcrypt: /usr/share/info/gcrypt.info-1.gz /usr/share/info/gcrypt.info-2.gz /usr/share/info/gcrypt.info.gz gnupg: /usr/share/man/man7/gnupg.7.gz /usr/share/info/gnupg.info-1.gz /usr/share/info/gnupg.info-2.gz /usr/share/info/gnupg.info.gz hostname: /usr/share/man/man1/hostname.1.gz /usr/share/man/man5/hostname.5.gz /usr/share/man/man7/hostname.7.gz java: /usr/share/man/man1/java.1.gz /usr/share/man/man1/java.1 locale: /usr/share/man/man1/locale.1.gz /usr/share/man/man1p/locale.1p.gz /usr/share/man/man3/locale.3pm.gz /usr/share/man/man5/locale.5.gz
which和whereis的区别
which命令是查找某个命令的完整路径,也就是说它是用来查找可执行文件的,which命令的原理是在当前登录用户的PATH环境变量记录的路径中进行查找。which命令使用例子:
which passwd(查找passwd命令的二进制文件路径)
而whereis命令则是用来快速查找任何文件,注意是任何文件,所以是一个文件搜索命令,它和另一个文件搜索命令locate的功能是一样的。比如如果输入:whereis passwd,那么找到的结果就比which命令找到的内容多,因为which命令只会列出二进制文件路径,而whereis命令会把所有带有passwd字样的文件路径都列举出来。
locate
Linux locate命令用于查找符合条件的文档,他会去保存文档和目录名称的数据库内,查找合乎范本样式条件的文档或目录。
一般情况我们只需要输入 locate your_file_name 即可查找指定文件。locate 与 find不同: find 是去硬盘找,locate 只在 /var/lib/slocate 资料库中找。
语法
locate [-d ][--help][--version][范本样式...]
参数:
- -b, --basename -- 仅匹配路径名的基本名称
- -c, --count -- 只输出找到的数量
- -d, --database DBPATH -- 使用 DBPATH 指定的数据库,而不是默认数据库 /var/lib/mlocate/mlocate.db
- -e, --existing -- 仅打印当前现有文件的条目
- -1 -- 如果 是 1.则启动安全模式。在安全模式下,使用者不会看到权限无法看到的档案。这会始速度减慢,因为 locate 必须至实际的档案系统中取得档案的权限资料。
- -0, --null -- 在输出上带有NUL的单独条目
- -S, --statistics -- 不搜索条目,打印有关每个数据库的统计信息
- -q -- 安静模式,不会显示任何错误讯息。
- -P, --nofollow, -H -- 检查文件存在时不要遵循尾随的符号链接
- -l, --limit, -n LIMIT -- 将输出(或计数)限制为LIMIT个条目
- -n -- 至多显示 n个输出。
- -m, --mmap -- 被忽略,为了向后兼容
- -r, --regexp REGEXP -- 使用基本正则表达式
- --regex -- 使用扩展正则表达式
- -q, --quiet -- 安静模式,不会显示任何错误讯息
- -s, --stdio -- 被忽略,为了向后兼容
- -o -- 指定资料库存的名称。
- -h, --help -- 显示帮助
- -i, --ignore-case -- 忽略大小写
- -V, --version -- 显示版本信息
locate 读取一个或多个由 updatedb 更新的数据库,并将至少与 PATTERN 之一匹配的文件名写入标准输出,每行一个。 如果未指定 --regex,则 PATTERN 可以包含通配符。 如果任何 PATTERN 不包含通配符,则 locate 的行为就像模式是 PATTERN 一样。默认情况下, locate 不检查在数据库中找到的文件是否仍然存在(但如果数据库是使用 --require-visibility no 构建的,它确实要求所有父目录都存在)。locate 永远不会报告在相关数据库的最新更新之后创建的文件。
实例
- 查找passwd文件
结果一不小心出了错,locate是Linux系统中的一个查找(定位)文件命令,和find命令等找寻文件的工作原理类似,但 locate是通过生成一个文件和文件夹的索引数据库,当用户在执行loacte命令查找文件时,它会直接在索引数据库里查找,若该数据库太久没更新或不存在,在查找文件时就提示:“locate: can not open /var/lib/mlocate/mlocate.db': No such file or directory”
[root@honey-master etc] updatedb 这个命令代表更新系统数据库 [root@honey-master etc] locate passwd /etc/passwd /etc/passwd- /etc/nginx/sites-enabled/.ngpasswd .....
- 搜索etc目录下面所有以sh开头的文件:这个命令并不是绝对目录从/etc开始的,而是路径中包含/etc的
[root@honey-master etc] locate /etc/sh /etc/shadow /etc/shadow- /etc/shells /opt/ratel/src/ratel/pot/cowrie/honeyfs/etc/shadow /var/lib/docker/overlay2/05de095b00667b554845f30b9de77132c60f40a2c3147fc53b12fa8f3dbec898/diff/etc/shells /var/lib/docker/overlay2/0cf774c1dd10317a356c67829df496748a6aec6e54e8b66aab39e1d16f7c4922/diff/etc/shadow
- 忽略大小写搜索当前用户目录下所有以 ra 开头的文件 :
[root@honey-master etc] locate -i ~/ra /var/lib/docker/overlay2/0f8abd62de9ec6fc1fa25f18cae942d529577b35c9734af4dd68e2e5e4d28803/diff/root/rasp-2022-01-28 /var/lib/docker/overlay2/0f8abd62de9ec6fc1fa25f18cae942d529577b35c9734af4dd68e2e5e4d28803/diff/root/rasp-2022-01-28/RaspInstall.jar /var/lib/docker/overlay2/0f8abd62de9ec6fc1fa25f18cae942d529577b35c9734af4dd68e2e5e4d28803/diff/root/rasp-2022-01-28/rasp /var/lib/docker/overlay2/0f8abd62de9ec6fc1fa25f18cae942d529577b35c9734af4dd68e2e5e4d28803/diff/root/rasp-2022-01-28/rasp/conf /var/lib/docker/overlay2/0f8abd62de9ec6fc1fa25f18cae942d529577b35c9734af4dd68e2e5e4d28803/diff/root/rasp-2022-01-28/rasp/plugins /var/lib/docker/overlay2/0f8abd62de9ec6fc1fa25f18cae942d529577b35c9734af4dd68e2e5e4d28803/diff/root/rasp-2022-01-28/rasp/rasp-engine.jar /var/lib/docker/overlay2/0f8abd62de9ec6fc1fa25f18cae942d529577b35c9734af4dd68e2e5e4d28803/diff/root/rasp-2022-01-28/rasp/rasp.jar /var/lib/docker/overlay2/0f8abd62de9ec6fc1fa25f18cae942d529577b35c9734af4dd68e2e5e4d28803/diff/root/rasp-2022-01-28/rasp/conf/openrasp.yml /var/lib/docker/overlay2/0f8abd62de9ec6fc1fa25f18cae942d529577b35c9734af4dd68e2e5e4d28803/diff/root/rasp-2022-01-28/rasp/plugins/official.js /var/lib/docker/overlay2/65625bc03c4a1a5f1d41a0cea4c47758413387c31d9e0b91989cb97d7a368f3d/diff/root/rasp-java.tar.gz
- 输出数量
[root@honey-master etc] locate -i ~/ra -c 10
which是通过 PATH环境变量到该路径内查找可执行文件,所以基本的功能是寻找可执行文件。
和find相比,whereis查找的速度非常快,这是因为linux系统会将系统内的所有文件都记录在一个数据库文件中,当使用whereis和locate时,会从数据库中查找数据,而不是像find命令那样,通过遍历硬盘来查找,效率自然会很高。但是,该数据库文件并不是实时更新,默认情况下时一星期更新一次,因此,我们在用whereis和locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。
当我们用whereis和locate无法查找到我们需要的文件时,可以使用find,但是find是在硬盘上遍历查找,因此非常消耗硬盘的资源,而且效率也非常低,因此建议大家优先使用whereis和locate。