linux命令_which&&whereis&&locate以及区别

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

实际用法

  1. 显示命令的路径

    [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 配置内容所找到的命令当然不一样的。

  1. 显示命令的别名

    [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 和 $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 命令,同时也会显示帮助页面和源码所在路径。(如果能找到的情况下会显示,但是在这一例中没有找到)所以你在输出中看见的第二个路径就是帮助页面文件所在位置。

实例

  1. 如果你想只搜索,假设说,二进制文件,你可以使用 -b 这一命令行选项。

    [root@honey-master etc] whereis -b bash
    bash: /usr/bin/bash
    
  2. 只查找说明文件

    [root@honey-master etc] whereis -m bash
    bash: /usr/share/man/man1/bash.1.gz /usr/share/info/bash.info.gz
    
  3. 默认情况下,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 这一选项来明确分隔目录列表和要搜索的文件名。

  4. 查看whereis的搜索路径

    [root@honey-master etc] whereis -l
    bin: /usr/bin
    bin: /usr/sbin
    bin: /usr/lib
    bin: /usr/lib64
    bin: /etc
    ...
    
  5. 对于 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 永远不会报告在相关数据库的最新更新之后创建的文件。

实例

  1. 查找passwd文件

    image-20220601104234361

    结果一不小心出了错,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
    .....
    
  2. 搜索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
    
  3. 忽略大小写搜索当前用户目录下所有以 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
    
  4. 输出数量

    [root@honey-master etc] locate -i ~/ra -c
    10
    

image-20220601105605189

which是通过 PATH环境变量到该路径内查找可执行文件,所以基本的功能是寻找可执行文件。

和find相比,whereis查找的速度非常快,这是因为linux系统会将系统内的所有文件都记录在一个数据库文件中,当使用whereis和locate时,会从数据库中查找数据,而不是像find命令那样,通过遍历硬盘来查找,效率自然会很高。但是,该数据库文件并不是实时更新,默认情况下时一星期更新一次,因此,我们在用whereis和locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。

当我们用whereis和locate无法查找到我们需要的文件时,可以使用find,但是find是在硬盘上遍历查找,因此非常消耗硬盘的资源,而且效率也非常低,因此建议大家优先使用whereis和locate。

posted @ 2022-06-01 11:01  ivanlee717  阅读(297)  评论(4编辑  收藏  举报