Linux:搜索命令which、whereis、loacte、find

相关文章

Linux专栏icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/category_12234591.html


1、which

        which命令通常被用来搜索可执行文件(命令),因为它在环境变量$PATH指定的目录中搜索命令,且搜索的文件对使用which命令的用户来说一定要具有可执行权限,还需要注意的是这个搜索并不会搜索子目录,而且不会解析符号链接(软链接)。

用法:
which [-a] filename...

选项:
-a 显示所有搜索结果,而不是在搜索到一个结果就停止
例1
$which python
/opt/miniconda3/bin/python

$which -a python
/opt/miniconda3/bin/python
/usr/bin/python

        在一些Linux发行版中,which命令还可以查询命令别名(alias)以及原命令所在的位置,如下例所示,原因在于使用了alias定义了which为一个别名,并将alias的输出传递给了which命令

例2
$which ll
alias ll='ls -l --color=auto'
	/usr/bin/ls

$which l.
alias l.='ls -d .* --color=auto'
	/usr/bin/ls

$which which
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
	/usr/bin/alias
	/usr/bin/which

2、whereis

        whereis命令只在特定目录下搜索文件,因此搜索速度较快。在进行搜索前,whereis命令会把filename的完整路径名和.c之类的后缀剥离,所以搜索结果也可能带有类似.c之类的后缀。

        三类目录在搜索范围内:由$PATH环境变量指定的bin类目录;由$MANPATH环境变量指定的manual类目录,和源代码source类目录。

用法:
$whereis [-bmsul] [-BMS directory... -f] filename...

选项:
-b 只显示bin类目录中搜索到的文件,所以一般用于搜索命令,
-m 只显示manual类目录中搜索到的文件,所以一般用于搜索帮助文档
-s 只显示source类目录中搜索到的文件
-u 只显示搜索结果大于1个的文件
-l 列出搜索的全部目录(当指定了-BMS后须要放在-f选项后)
-B 人为指定bin类的搜索目录
-M 人为指定manual类的搜索目录
-S 人为指定source类的搜索目录
-f 如果有-BMS中的任何一个,则需要-f来分隔directory与filename
例3
$whereis -l
bin: /usr/bin
...
man: /usr/share/man/man0p
...
src: /usr/src/debug
src: /usr/src/kernels

$whereis python
python: /usr/bin/python /usr/bin/python2.7 /usr/lib/python2.7 /usr/lib64/python2.7 /etc/python /usr/include/python2.7 /usr/share/man/man1/python.1.gz //可以看到搜索结果可能有后缀

$whereis /home/python //搜索结果一致,在搜索前会把绝对路径剥离
python: /usr/bin/python /usr/bin/python2.7 /usr/lib/python2.7 /usr/lib64/python2.7 /etc/python /usr/include/python2.7 /usr/share/man/man1/python.1.gz

$whereis python.1111  //搜索结果一致,在搜索前会把后缀剥离
python: /usr/bin/python /usr/bin/python2.7 /usr/lib/python2.7 /usr/lib64/python2.7 /etc/python /usr/include/python2.7 /usr/share/man/man1/python.1.gz

$whereis -b perl
perl: /usr/bin/perl //只有一个搜索结果

$whereis -b -u perl
//无搜索结果

$whereis -b -B /usr/bin -f python //-f切记不能少
python: /usr/bin/python /usr/bin/python2.7 //限制bin类目录为/usr/bin

$whereis -b -B /usr/bin -f -l //-l要放在-f后面,否则会显示错误的搜索路径
man: /usr/share/man/man0p  //可以看到即使指定了-b,仍然显示了所有类的搜索路径,只是bin类的被修改了
...
src: /usr/src/debug
src: /usr/src/kernels
bin: /usr/bin

3、locate

        locate命令可以根据模式串匹配查找,所以只要给出目标文件名的一部分即可,locate命令是在updatedb命令维护的数据库/var/lib/mlocate/mlocate.db中搜索的,所以可能会出现新建立的文件搜索不到,或已删除的文件仍然搜索得到。如果想要更精确的搜索结果,可以在locate搜索前先调用updatedb命令。

用法:
$locate [-AbwcilSr] patterns...
选项:
-A 在匹配时要求满足所有patterns而不只是其中之一
-b 只根据文件的基本名称匹配(没有路径)
-w 根据文件的完整名称匹配(有绝对路径)(这是默认的)
-c 输出匹配成功的条目数,而不是文件名。
-i 在匹配时忽略大小写区分
-l number在找到指定数量的条目后停止搜索
-S 输出数据库的统计信息(此时不允许参数里有patterns)
-r 使用正则表达式匹配
$locate -l 5 ython //搜索到5条结果后停止搜索
/etc/python
/etc/abrt/plugins/python.conf
/etc/libreport/events.d/python_event.conf
/etc/python/cert-verification.cfg   //默认搜索完整路径名
/etc/rpm/macros.python-srpm

$locate -b -l 5 python //搜索文件基本名,搜索到5条结果后停止搜索
/etc/python
/etc/abrt/plugins/python.conf
/etc/libreport/events.d/python_event.conf
/etc/rpm/macros.python-srpm
/usr/bin/abrt-action-analyze-python

$locate -A python rpm etc //要求同时满足三个模式
/etc/rpm/macros.python-srpm

$locate -c Make
2020

$locate -i -l 5 Make //忽略大小写
/etc/makedumpfile.conf.sample
/etc/pki/tls/certs/Makefile
/etc/pki/tls/certs/make-dummy-cert
/usr/bin/automake
/usr/bin/automake-1.13

$locate -S //显示数据库信息
数据库 /var/lib/mlocate/mlocate.db:
	15,634 文件夹
	162,678 文件
	8,431,153 文件名中的字节数
	3,836,413 字节用于存储数据库

$locate -b -l 5 -r "\.txt$" //使用正则表达式匹配基本名以.txt结尾的文件,搜索到5条结果后停止搜索
/etc/brltty/brl-ba-all.txt
/etc/brltty/brl-bd-all.txt
/etc/brltty/brl-bl-18.txt
/etc/brltty/brl-bl-40_m20_m40.txt
/etc/brltty/brl-ec-all.txt

4、find

        find命令在硬盘中搜索文件,因此耗费的时间较久,但它拥有强大的搜索能力。

用法:
$find [path...] [expressions]

1、描述

        find命令搜索目录树上的每一个文件名,它从左至右运算给定的表达式,按照优先规则(见运算符OPERATORS一节)进行匹配,直到得出结果(左边运算在“与”操作中得出假,在“或”操作中得出真),然后find移向下一个文件名。

        第一个以-、(、)、,或!这些字符起始的参数是表达式的开始;在它之前的任何参数是要搜索的路径,在它之后的任何参数都是表达式的余下部分。如果没有路径参数,缺省用当前工作目录。如果没有表达式,缺省表达式用“-print”。当所有文件都成功处理时find退出并返回状态值0。如果发生错误则返回一个大于0的值。

2、表达式

        表达式是由选项(选项总是影响所有的操作,而不仅仅是一个指定的文件的处理,而且总是返回真值),测试(测试返回一个真值或一个假值),还有动作(动作有side effects,比如-print动作是在标准输出打印文件全名,返回一个真值或假值)组成。它们都以运算符分开忽略运算符的时候,默认使用-and即“与”连接。如果表达式没有包含 -prune以外的动作,当表达式为真时会执行-print动作。

3、选项

        所有的选项总是返回真值,因此一般情况下选项都会被执行,除非被放在了表达式执行不到的位置,因此最好将选项全部放在表达式开头的位置,并且不要使用!、-not连接选项,否则会强制终止表达式的执行。

选项:
-daystart 在计算时间时,使用当天0点作为参考点而不是当前时间作为参考。
-depth    在对目录进行处理时,首先处理目录中的文件,最后处理目录本身。
-follow   不检索符号链接类文件,而是直接检索链接指向的文件,隐含了-noleaf选项。
-help     列出find命令的用法并退出。
-maxdepth [levels] 进入命令行指定的目录下层目录时,最深不超过levels层,-maxdepth 0和-maxdepth代表不进入下层目录
-mindepth [levels] 不在levels层之内执行任何测试和动作,-mindepth 1表示不在命令行指定的目录下处理文件,而只在子目录之内处理。
-mount    不进入处于其他文件系统之上的目录。可以用-xdev代替,从而和一些其他版本的find兼容。
-noleaf   不为“目录中子目录数量比硬连接数少2”这种假设做优化。这个选项在搜索那些不遵循UNIX文件系统链接约定的文件系统时用,比如CD-ROM,MS-DOS文件系统或AFS卷的加载点。在普通的UNIX文件系统中,每个目录至少有两个硬连接,它的名字和它'.'子目录。另外,它的其他子目录(假如有)还会各有一个'..'链接到它。在find检索一个目录时,发现子目录数比它的连接数少二时,它就知道目录中的其他条目并非目录(而是目录树中的叶(`leaf')节点)。除非需要检索的是这个叶节点,否则没必要去处理它。这样可以带来很大的搜索速度提升。
-version  打印find的版本号然后退出。
-xdev     不进入处于其他文件系统之上的目录。

4、测试

测试:
-amin [n|-n|+n]    对文件的访问时间是在第n分钟内,第n分钟后、第n分钟前。
(默认情况下,第0分钟指的是当前时间的的1分钟前这一时刻,所以假设当前时间为15分,
-amin 0指的是14分到15分,-amin +0指的是14分以前,-amin 1指的是13分到14分,
-amin +1指的是13分以前,-amin -1指的是14分后,对于后面的-mtime也是如此)

-anewer file       对文件的最近一次访问时间比file的内容修改时间要晚。
-atime [n|-n|+n]   对文件的访问时间是在第n天内,第n天后、第n天前。

-cmin [n|-n|+n]    对文件状态的修改时间是在第n分钟内,第n分钟后、第n分钟前。
-cnewer file       对文件状态的修改时间比file的内容修改时间要晚。
-ctime n           对文件状态的修改时间是在第n天内,第n天后、第n天前。

-empty             文件是空的普通文件或者空目录。
-false             总是false。
-true              总是true。
-gid n             文件的数字形式的组ID是n。
-group gname       文件属于gname (也允许使用数字形式的组ID)。
-link n            文件有 n 个链接。
-mmin n [n|-n|+n]  对文件内容的修改时间是在第n分钟内,第n分钟后、第n分钟前。
-mtime n [n|-n|+n] 对文件内容的修改时间是在第n天内,第n天后、第n天前。
-newer file        对文件内容的修改时间比file的内容修改时间要晚。
-name pattern      基本的文件名(将路径去掉了前面的目录)与pattern相匹配,如需使用通配符*等,需要用引号包围pattern。
-nouser            没有符合文件的数字形式的用户ID的用户。
-nogroup           没有符合文件的数字形式的组ID的组。
-path pattern      完整文件名与pattern相匹配,如需使用通配符*等,需要用引号包围pattern。
-regex pattern     文件名与正则表达式pattern匹配,pattern需要用引号包围,且必须整个文件完全匹配,即est无法匹配/test。
-type c            文件是 c 类型的。类型可取值如下:
                   b      特殊块文件(缓冲的)
                   c      特殊字符文件(不缓冲)
                   d      目录
                   p      命名管道 (FIFO)
                   f      普通文件
                   l      符号链接
                   s      套接字
                   D      门 (Solaris 特有)
-uid n             文件的数字形式的用户ID是 n 。
-user uname        文件的所有者是 uname (也可以使用数字形式的用户ID)。

5、动作

动作:
-exec command \;
执行 command;如果命令返回状态值0,那么exec返回true。所有find其余的命令行参数将作为提供给命令的参数,直到遇到一个由`;'组成的参数为止。
命令的参数中,字符串`{}'将以正在处理的文件名替换。所有的`{}'都会被替换,不仅是在单独的一个参数中。有些版本的find不是这样做的。
这些参数可能需要用`\'来escape或者用括号括住,防止它们被shell展开。命令是从当前工作目录执行的。
-print 返回true;在标准输出打印文件全名,然后是一个换行符。

6、运算符

以优先级高低顺序排列:
( expr )                强制为优先
! expr                  如果expr是false则返回true
-not expr               与!expr相同
expr1 expr2             与(隐含的默认运算符);如果expr1为false则不会执行expr2
expr1 -a expr2          与expr1 expr2 相同
expr1 -and expr2        与expr1 expr2 相同
expr1 -o expr2          或;如果expr1为true则不会执行expr2
expr1 -or expr2         与expr1 -o expr2相同
expr1 , expr2           列表;expr1和expr2都会被执行。expr1的值被忽略,列表的值是expr2的值

你可能感兴趣的:(Linux,linux,运维,服务器)