Linux 下各种查找命令(find, grep, which, whereis, locate)

2024-03-20 22:08

本文主要是介绍Linux 下各种查找命令(find, grep, which, whereis, locate),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

find 命令

find <path> < expression > < cmd >

  • path: 所要搜索的目录及其所有子目录。默认为当前目录。
    • expression: 所要搜索的文件的特征。
    • cmd: 对搜索结果进行特定的处理。

    如果什么参数也不加,find 默认搜索当前目录及其子目录,并且不过滤任何结果(也就是返回所有文件),将它们全都显示在屏幕上。

    find 命令常用选项及实例
    • -name 按照文件名查找文件。
      1. find /dir -name filename 在/dir目录及其子目录下面查找名字为filename的文件
      2. find . -name ”*.c” 在当前目录及其子目录(用“.”表示)中查找任何扩展名为“c”的文件
    • -perm 按照文件权限来查找文件。
      find . -perm 755print 在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件
      
    • -prune 使用这一选项可以使 find 命令不在当前指定的目录中查找,如果同时使用 - depth 选项,那么 - prune 将被 find 命令忽略。
      1. find /apps -path ”/apps/bin” -prune -o –print 在/apps目录下查找文件,但不希望在/apps/bin目录下查找
      2. find /usr/sam -path ”/usr/sam/dir1” -prune -o –print 在/usr/sam目录下查找不在dir1子目录之内的所有文件
    • -depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
      find / -name "CON.FILE" -depth –print 它将首先匹配所有的文件然后再进入子目录中查找
      
    • -user 按照文件属主来查找文件。
      find ~ -user sam –print 在$HOME目录中查找文件属主为sam的文件
      
    • -group 按照文件所属的组来查找文件。
      find /apps -group gem –print 在/apps目录下查找属于gem用户组的文件
      
    • -mtime -n +n 按照文件的更改时间来查找文件, -n 表示文件更改时间距现在 n 天以内,+n 表示文件更改时间距现在 n 天以前。
      1. find / -mtime -5print 在系统根目录下查找更改时间在5日以内的文件
      2. find /var/adm -mtime +3print 在/var/adm目录下查找更改时间在3日以前的文件
    • -nogroup 查找无有效所属组的文件,即该文件所属的组在 / etc/groups 中不存在。
      find / –nogroup -print
      
    • -nouser 查找无有效属主的文件,即该文件的属主在 / etc/passwd 中不存在。
      find /home -nouser –print
      
    • -newer file1 ! file2 查找更改时间比文件 file1 新但比文件 file2 旧的文件。
    • -type 查找某一类型的文件,
      诸如:
      b - 块设备文件。
      d - 目录。
      c - 字符设备文件。
      p - 管道文件。
      l - 符号链接文件。
      f - 普通文件。
      1. find /etc -type d –print 在/etc目录下查找所有的目录
      2. find . ! -type d –print 在当前目录下查找除目录以外的所有类型的文件
      3. find /etc -type l –print 在/etc目录下查找所有的符号链接文件
    • -size n[c] 查找文件长度为 n 块的文件,带有 c 时表示文件长度以字节计。
      1. find . -size +1000000c –print 在当前目录下查找文件长度大于1 M字节的文件
      2. find /home/apache -size 100c –print 在/home/apache目录下查找文件长度恰好为100字节的文件
      3. find . -size +10print 在当前目录下查找长度超过10块的文件(一块等于512字节)
    • -mount:在查找文件时不跨越文件系统 mount 点。
      find . -name “*.XC” -mount –print 从当前目录开始查找位于本文件系统中文件名以 XC 结尾的文件(不进入其他文件系统)
    • -follow:如果 find 命令遇到符号链接文件,就跟踪至链接所指向的文件
    • -exec,find 命令对匹配的文件执行该参数所给出的 shell 命令。相应命令的形式为’command’ {} \;,注意 {} 和 \; 之间的空格
    1. $ <span class="hljs-built_in">find</span> ./ -size <span style="color:rgb(249,145,87);"><span class="hljs-number">0</span></span> -exec rm {} \; 删除文件大小为零的文件</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">$ rm -i `find ./ -size 0`
    2. $ <span class="hljs-built_in">find</span> ./ -size <span style="color:rgb(249,145,87);"><span class="hljs-number">0</span></span> | xargs rm -f &amp;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在<span class="hljs-built_in">find</span>命令的-exec选项中:</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">$ find . -type f -exec ls -l {} \;
    3. 在/logs目录中查找更改时间在5日以前的文件并删除它们:
    4. find /logs -type f -mtime +5 -exec rm {} \;
    • -ok,和 - exec 的作用相同,只不过以一种更为安全的模式来执行该参数所给出的 shell 命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
      find . -name "*.conf"  -mtime +5 -ok rm {  } \; 在当前目录中查找所有文件名以.LOG结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示
      

    说明: 如果你要寻找一个档案的话,那么使用 find 会是一个不错的主意。不过,由于 find 在寻找数据的时候相当的耗硬盘,所以没事情不要使用 find 啦!有更棒的指令可以取代呦,那就是 whereis 与 locate 咯~

    一些常用命令
    1. 1. find . -type f -exec ls -l {} \;
    2. 查找当前路径下的所有普通文件,并把它们列出来。
    3. 2. find logs -type f -mtime +5 -exec rm {} \;
    4. 删除logs目录下更新时间为5日以上的文件。
    5. 3.find . -name "*.log" -mtime +5 -ok rm {} \;
    6. 删除当前路径下以。log结尾的五日以上的文件,删除之前要确认。
    7. 4. find ~ -type f -perm 4755 -print
    8. 查找$HOME目录下suid位被设置,文件属性为755的文件打印出来。
    9. 说明: find在有点系统中会一次性得到将匹配到的文件都传给exec,但是有的系统对exec的命令长度做限制,就会报:”参数列太长“,这就需要使用xargs。xargs是部分取传来的文件。
    10. 5. find / -type f -print |xargs file
    11. xargs测试文件分类
    12. 6. find . -name "core*" -print|xargs echo " ">/tmp/core.log
    13. 将core文件信息查询结果报存到core。log日志。
    14. 7. find / -type f -print | xargs chmod o -w
    15. 8. find . -name * -print |xargs grep "DBO"

    grep 命令

    grep [选项] pattern [文件名]

    命令中的选项为:

    • -? 同时显示匹配行上下的?行,如:grep -2 pattern filename 同时显示匹配行的上下 2 行。
    • -b,—byte-offset 打印匹配行前面打印该行所在的块号码。
    • -c,—count 只打印匹配的行数,不显示匹配的内容。
    • -f File,—file=File 从文件中提取模板。空文件中包含 0 个模板,所以什么都不匹配。
    • -h,—no-filename 当搜索多个文件时,不显示匹配文件名前缀。
    • -i,—ignore-case 忽略大小写差别。
    • -q,—quiet 取消显示,只返回退出状态。0 则表示找到了匹配的行。
    • -l,—files-with-matches 打印匹配模板的文件清单。
    • -L,—files-without-match 打印不匹配模板的文件清单。
    • -n,—line-number 在匹配的行前面打印行号。
    • -s,—silent 不显示关于不存在或者无法读取文件的错误信息。
    • -v,—revert-match 反检索,只显示不匹配的行。
    • -w,—word-regexp 如果被 \<和> 引用,就把表达式做为一个单词搜索。
    • -V,—version 显示软件版本信息。
    1. ls -l | grep '^a' 通过管道过滤ls -l输出的内容,只显示以a开头的行。
    2. grep 'test' d* 显示所有以d开头的文件中包含test的行。
    3. grep 'test' aa bb cc 显示在aa,bb,cc文件中匹配test的行。
    4. grep '[a-z]' aa 显示所有包含每个字符串至少有5个连续小写字符的字符串的行。
    5. grep 'w(es)t.*' aa 如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着另外一个es(),找到就显示该行。如果用egrep或grep -E,就不用""号进行转义,直接写成'w(es)t.*'就可以了。
    6. grep -i pattern files :不区分大小写地搜索。默认情况区分大小写
    7. grep -l pattern files :只列出匹配的文件名,
    8. grep -L pattern files :列出不匹配的文件名,
    9. grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配‘magic’,而不是‘magical’),
    10. grep -C number pattern files :匹配的上下文分别显示[number]行,
    11. grep pattern1 | pattern2 files :显示匹配 pattern1 或 pattern2 的行,
    12. grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行。

    pattern 为所要匹配的字符串,可使用下列模式

    1. . 匹配任意一个字符
    2. * 匹配0 个或多个*前的字符
    3. ^ 匹配行开头
    4. $ 匹配行结尾
    5. [] 匹配[ ]中的任意一个字符,[]中可用 - 表示范围,
    6. 例如[a-z]表示字母a 至z 中的任意一个
    7. \ 转意字符

    xargs 命令

    【xargs 定位参数位置 | xargs 控制参数位置 | 如何定位控制 xargs 参数位置】

    背景
    管道 + xargs 用于把上游输出转换为下游参数输入。
    例如 ls *.bak | xargs rm -f

    问题

    xargs 默认把输入作为参数放到命令的最后,但是很多命令需要自己定位参数的位置,比如拷贝命令cp {上游结果} destFolder

    解决方法

    xargs 使用大写字母 i 定义参数指示符 -I <指示符>,然后用这个参数指示符定位参数插入的位置, 例如:

    ls *.bak | xargs -I % cp % /tmp/test
    

    注释:这里使用 % 作为指示符,第一个 % 可以理解为声明,第二个 % 可以理解为调用。你也可以用其他字符,比如 ls *.bak | xargs -I {} cp {} /tmp/test

    简介

    之所以能用到 xargs 这个命令,关键是由于很多命令不支持 | 管道来传递参数,而日常工作中有有这个必要,所以就有了 xargs 命令,例如:

    1. find /sbin -perm +700 | ls -l 这个命令是错误的
    2. find /sbin -perm +700 | xargs ls -l 这样才是正确的

    xargs 可以读入 stdin 的资料,并且以空白字元或断行字元作为分辨,将 stdin 的资料分隔成为 arguments 。 因为是以空白字元作为分隔,所以,如果有一些档名或者是其他意义的名词内含有空白字元的时候, xargs 可能就会误判了~

    选项解释

    • -0 当 sdtin 含有特殊字元时候,将其当成一般字符,像 / ‘ 空格等
      1. root@localhost:~/test#echo “//”|xargs echo
      2. root@localhost:~/test#echo “//”|xargs -0 echo
      3. /
    • -a file 从文件中读入作为 sdtin
      1. root@localhost:~/test#cat test#!/bin/shecho ”hello world/n”
      2. root@localhost:~/test#xargs -a test echo#!/bin/sh echo hello world/n
      3. root@localhost:~/test#
    • -e flag ,注意有的时候可能会是 - E,flag 必须是一个以空格分隔的标志,当 xargs 分析到含有 flag 这个标志的时候就停止。
      1. root@localhost:~/test#cat txt
      2. /bin tao shou kun
      3. root@localhost:~/test#cat txt|xargs -E ‘shou’ echo
      4. /bin tao
    • -p 当每次执行一个 argument 的时候询问一次用户。
      1. root@localhost:~/test#cat txt|xargs -p echoecho /bin tao shou kun ff ?…y
      2. /bin tao shou kun ff
    • -n num 后面加次数,表示命令在执行的时候一次用的 argument 的个数,默认是用所有的
      1. root@localhost:~/test#cat txt|xargs -n1 echo
      2. /bin
      3. tao
      4. shou
      5. kun
      6. root@localhost:~/test3#cat txt|xargs echo
      7. /bin tao shou ku
    • -t 表示先打印命令,然后再执行。
      1. root@localhost:~/test#cat txt|xargs -t echoecho /bin tao shou kun
      2. /bin tao shou kun
    • -i 或者是 - I,这得看 linux 支持了,将 xargs 的每项名称,一般是一行一行赋值给 {},可以用 {} 代替。
      1. $ ls | xargs -t -i mv {} {}.bak
    • -r no-run-if-empty 当 xargs 的输入为空的时候则停止 xargs,不用再去执行了。
      1. root@localhost:~/test#echo “”|xargs -t -r mv
      2. root@localhost:~/test#
    • -s num 命令行的最大字符数,指的是 xargs 后面那个命令的最大命令行字符数
      1. root@localhost:~/test#cat test |xargs -i -x -s 14 echo “{}”
      2. exp1
      3. exp5
      4. file
      5. xargs: argument line too long
      6. linux-2
      7. root@localhost:~/test#
    • -L num Use at most max-lines nonblank input lines per command line.-s 是含有空格的。
    • -l 同 - L
    • -d delim 分隔符,默认的 xargs 分隔符是回车argument 的分隔符是空格,这里修改的是 xargs 的分隔符
      1. root@localhost:~/test#cat txt |xargs -i -p echo {}echo /bin tao shou kun ?…y
      2. root@localhost:~/test#cat txt |xargs -i -p -d ” ” echo {}echo /bin ?…y
      3. echo tao ?…/bin
      4. y
      5. echo shou ?…tao
      6. 再如:
      7. root@localhost:~/test#cat test |xargs -i -p -d ” ” echo {}echo exp1
      8. exp5
      9. file
      10. linux-2
      11. ngis_post
      12. tao
      13. test
      14. txt
      15. xen-3
      16. ?…y
      17. root@localhost:~/test#cat test |xargs -i -p echo {}echo exp1 ?…y
      18. echo exp5 ?…exp1
      19. y
      20. echo file ?…exp5
      21. y
    • -x exit 的意思,主要是配合 - s 使用。
    • -P 修改最大的进程数,默认是 1,为 0 时候为 as many as it can

    其他查找命令

    1. locate 命令

    locate 命令其实是 “find -name” 的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),这个数据库中含有本地所有文件信息。Linux 系统自动创建这个数据库,并且每天自动更新一次,所以使用 locate 命令查不到最新变动过的文件。为了避免这种情况,可以在使用 locate 之前,先使用 updatedb 命令,手动更新数据库。

    locate 命令的使用实例:

    1. $ locate /etc/sh</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">搜索etc目录下所有以sh开头的文件。</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">$ locate -i ~/m
    2. 搜索用户主目录下,所有以m开头的文件,并且忽略大小写。
    2. whereis 命令

    whereis 命令只能用于程序名的搜索,而且只搜索二进制文件(参数 - b)、man 说明文件(参数 - m)和源代码文件(参数 - s)。如果省略参数,则返回所有信息。

    whereis 命令的使用实例:

    1. $ whereis grep
    2. grep: /bin/grep /usr/share/man/man1p/grep.1p.gz /usr/share/man/man1/grep.1.gz
    3. which 命令

    which 命令的作用是,在 PATH 变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用 which 命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。

    which 命令的使用实例:

    1. $ which grep
    2. /bin/grep

这篇关于Linux 下各种查找命令(find, grep, which, whereis, locate)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/830876

相关文章

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

Linux中修改Apache HTTP Server(httpd)默认端口的完整指南

《Linux中修改ApacheHTTPServer(httpd)默认端口的完整指南》ApacheHTTPServer(简称httpd)是Linux系统中最常用的Web服务器之一,本文将详细介绍如何... 目录一、修改 httpd 默认端口的步骤1. 查找 httpd 配置文件路径2. 编辑配置文件3. 保存

Linux使用scp进行远程目录文件复制的详细步骤和示例

《Linux使用scp进行远程目录文件复制的详细步骤和示例》在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令,它允许在远程主机之间复制文件和目录,... 目录1. 什么是scp?2. 语法3. 示例示例 1: 复制本地目录到远程主机示例 2: 复制远程主

Java -jar命令如何运行外部依赖JAR包

《Java-jar命令如何运行外部依赖JAR包》在Java应用部署中,java-jar命令是启动可执行JAR包的标准方式,但当应用需要依赖外部JAR文件时,直接使用java-jar会面临类加载困... 目录引言:外部依赖JAR的必要性一、问题本质:类加载机制的限制1. Java -jar的默认行为2. 类加

git stash命令基本用法详解

《gitstash命令基本用法详解》gitstash是Git中一个非常有用的命令,它可以临时保存当前工作区的修改,让你可以切换到其他分支或者处理其他任务,而不需要提交这些还未完成的修改,这篇文章主要... 目录一、基本用法1. 保存当前修改(包括暂存区和工作区的内容)2. 查看保存了哪些 stash3. 恢

java -jar命令运行 jar包时运行外部依赖jar包的场景分析

《java-jar命令运行jar包时运行外部依赖jar包的场景分析》:本文主要介绍java-jar命令运行jar包时运行外部依赖jar包的场景分析,本文给大家介绍的非常详细,对大家的学习或工作... 目录Java -jar命令运行 jar包时如何运行外部依赖jar包场景:解决:方法一、启动参数添加: -Xb

Linux基础命令@grep、wc、管道符的使用详解

《Linux基础命令@grep、wc、管道符的使用详解》:本文主要介绍Linux基础命令@grep、wc、管道符的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录grep概念语法作用演示一演示二演示三,带选项 -nwc概念语法作用wc,不带选项-c,统计字节数-

MySQL的ALTER TABLE命令的使用解读

《MySQL的ALTERTABLE命令的使用解读》:本文主要介绍MySQL的ALTERTABLE命令的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、查看所建表的编China编程码格式2、修改表的编码格式3、修改列队数据类型4、添加列5、修改列的位置5.1、把列

Linux CPU飙升排查五步法解读

《LinuxCPU飙升排查五步法解读》:本文主要介绍LinuxCPU飙升排查五步法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录排查思路-五步法1. top命令定位应用进程pid2.php top-Hp[pid]定位应用进程对应的线程tid3. printf"%