Linux -- 常用搜索命令

搜索命令

  • 不管是 Windows 还是 Linux,尽量少用搜索,因为搜索会占用大量的资源,特别是服务器使用高峰时间段
  • 搜索的条件越精准越好
  • 搜索的范围越小越好

文件搜索命令 find

  • 所在路径/bin/find
  • 执行权限:所有用户
  • 格式
    • find [搜索范围] [匹配条件]
      • 搜索范围:
        • 通常是一个目录
      • 匹配条件(常用的):
        • -name [文件名]根据文件名搜索
          • 只有文件名完全相同的文件才会被匹配,不会模糊搜索
          • 要想实现模糊搜索,可以使用通配符*,*可以匹配任意字符
            • find /etc -name *init* 搜索文件名包含 init 的文件
            • find /etc -name init*搜索以init开头的文件
          • 使用?可以匹配单个字符
            • find /etc -name init??? 匹配文件名为七字符个并且前面四个为 init 的文件
          • 严格区分大小写!!
        • -iname 不区分大小写,其他的和-name相同
        • -size [+/-文件大小]根据文件大小筛选
          • 文件大小单位是一个数据块,即 0.5K(512 字节),使这种方法的时候我们需要换算数据单位
            • 1MB = 2048
          • + 文件大小 大于指定大小
            • 查找大于 100MB 的文件find / -size +204800
          • - 文件大小 小于指定大小
          • 当不加 [+/-] 的时候,表示搜索指定大小的文件,一般不用
        • -user [用户名] 根据文件所有者搜索文件
        • -cmin [+/- 时间大小], change,搜索指定时间范围内被修改文件属性的文件,默认单位为分钟
          • 文件属性,就是 ls -l 看见的文件属性
          • +表示超过指定时间
          • -表示指定时间长度之内
        • -amin [+/- 时间大小],access,搜索指定时间范围内被访问的文件
          • 访问时间
        • -mmin [+/- 时间大小],modify,搜索指定时间范围内修改文件内容的文件
        • -a,“and”, 用来链接条件,表示两个条件同时满足
          • find / -size +204800 -a -size -409600
        • -o,“or”, 用来链接条件,表示两个条件满足其中一个
        • -exec/ok 命令内容 {}\;对搜索结果执行 "命令内容" 中的操作
          • find /etc -user ziawang -exec ls -l {}\;使用ls -l查看指定目录下用户名为 ziawang 的文件或目录
          • {}表示 find 查找的结果
          • \表示转义符
          • ;分号表示结束
          • -ok会有一个询问确认的步骤
        • -type 文件类型,文件类型有三种
          • f: 文件
          • d: 目录
          • l: 软连接文件
        • -inum根据文件的 inode 来查询
          • 应用:如果文件的名称乱码,很难删除这个文件的情况下,使用inode删除文件
            • find . -inum 50505 -delete

注意

  • 对于名称中包含有空格的文件或目录,如果直接用rm 文件名,这个命令会认为删除了两个文件,这样显然不行,有两种方式来解决这个问题
    1. 对文件名用双引号包含起来
      • rm "haha file"
    2. 使用 i 结点删除(每一个文件都必须有一个结点)
      1. 找到文件 i 结点ls -i
      2. find / -inum 结点号 -exec rm {}\;

其他搜索命令

从文件资料库中查找文件 locate

  • 类似 Windows 的一个软件 "everything",这个命令建立了一个文件资料库,这个文件资料库会定时更新,查找时也是在文件资料库中查找,搜索速度非常快
    • 使用locate locate可以找到这个文件资料库
    • 这个文件资料库的路径/var/lib/mlocate/mlocate.db
  • 对于一个新建立的文件。在没有更新到文件资料库的时候,使用locate是找不到的没使用find可以找到
  • 手动更新资料库

    • updatedb命令可以更新资料库
    • 注意,文件资料库有一个收录范围,如果我们的新创建的文件不在该收录的路径下,即使创建完文件使用了 updatedb 命令也找不到该文件,比如 /tmp 就不再文件资料库的收录范围内
  • 所在路径:/usr/bin/locate
  • 执行权限:所有用户

  • 格式

    • locate [-i] 文件名
      • -i选项不区分大小写

搜索命令所在目录及别名信息 which

  • 所在路径: /usr/bin/which
  • 执行权限:所有用户
  • 格式
    • which 命令名

搜索命令所在目录以及命令帮助文档的历经 whereis

使用 find 也可以查看命令所在路径,只是速度慢

  • 所在路径:``
  • 执行权限:所有用户
  • 格式
    • whereis 命令名称
whereis passwd
  • 使用whereis passwd命令的时候,会得到四条结果,如下
    [root@host ~]# whereis passwd
    passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
  • 这是因为 Linux 系统系有一个名称位passwd的命令,又有一个passwd的配置文件。
    • /usr/share/man/man1/passwd.1.gz 这样以.1.gz结尾的文件对应的是命令的帮助文件路径
    • /usr/share/man/man5/passwd.5.gz 以.5.gz结尾的文件对应的则是配置文件对应的帮助文件的路径
  • 因此当我们使用man passwd的时候,得到的将会是命令的帮助文档信息,如果你想要看passwd配置文件的帮助信息,可以这样
    • man 5 passwd

文件内搜索命令 grep

  • 在文件中搜寻字符串匹配的行并输出
  • 所在路径:/bin/grep
  • 执行权限:所有用户
  • 格式
    • grep [-iv] [关键词字符串] [文件]
      • -i不区分大小写
        • grep -i mysql /root/install.log
      • -v排除指定字符串
        • grep -v ^# /root/inittab把行首以注释#开头的行去掉,只看有效的行
        • grep -i -v e manage.py查看manage.py中不包含e或E的行
        • 可以配合通配符^