Linux:搜索命令which、whereis、loacte和find详解
相关文章Linux专栏https://blog.csdn.net/weixin_45791458/category_12234591.html目录1、which2、whereis3、locate4、find1、whichwhich命令通常被用来搜索拥有可执行状态的文件命令因为它在环境变量$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 llls -l --colorauto /usr/bin/ls $which l. alias l.ls -d .* --colorauto /usr/bin/ls $which which alias whichalias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde /usr/bin/alias /usr/bin/whichwhich命令显示的第一个搜索结果也就是使用纯名字不使用绝对路径和相对路径时Bash在$PATH中搜索到的第一个搜索结到并执行的命令。2、whereiswhereis命令只在特定目录下搜索文件因此搜索速度较快。在进行搜索前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/bin3、locatelocate命令可以根据模式串匹配查找所以只要给出目标文件名的一部分即可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.txt4、findfind命令在硬盘中搜索文件因此耗费的时间较久但它拥有强大的搜索能力。用法 $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-ROMMS-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的值