Linux下命令与文件名的检索

原文地址:https://blog.qjm253.cn/?p=463

which

通过检索PATH中包含的目录,寻找一个“可执行文件”的位置

  • 用法介绍

    
    # 用法
    
    which [-a] command
    
    
    # 默认行为
    
    依次检索PATH中的目录,找到第一个与command名字匹配的文件,将其列出
    
    
    # 参数
    
    -a:将所有由PATH目录中可以找到的命令均列出
  • 注意事项

    • 默认情况下which命令时依次检索PATH中的目录,找到第一个符合条件的就输出并返回。如果加上-a参数,则会将PATH中的目录都检索一遍,列出所有符合条件的文件
    • 这个命令时根据PATH变量中定义的目录来检索的,不同的用户名登录,PATH可能是不同的
    • 有一些命令是shell内建的命令,用which是检索不到的,例如:cd

whereis

输入完整的文件名或目录名,在数据库中检索

  • 用法介绍

    
    # 用法
    
    whereis [-bmsu] {文件名,目录名}
    
    
    # 参数
    
    -b:只查找二进制文件
    -m:只找在说明文件manual路径下的文件
    -s:只找源文件
    -u:查找不在上述三个选项中的其他文件
  • 注意事项

    • Linux系统会将系统内所有的文件都记录在一个数据库文件里面,whereis是直接在这个数据库里面检索。但是数据库并不是实时更新的,有写发行版是每天更新一次,如果想立即更新数据库,需要手动执行updatedb(这个需要若干分钟)
    • 由于是直接检索数据库,速度会比find快很多。但是由于具有非实时性也可能检索到已经被删除的文件
    • 更多关于这个数据库的说明,请参参考下面介绍locate时的注意事项

locate

只需要输入部分的文件名或目录名,在数据库中检索

  • 用法介绍

    
    # 用法
    
    locate [-ir] keyword
    
    
    # 参数
    
    -i:忽略大小写差异
    -r:后面可接正则表达式
  • 注意事项

    • 同样的,locate 也是检索linux中的数据库来进行查询的,具有非实时性,但是速度会比find快很多
    • locatewhereis检索的数据库通常记录在 /var/lib/mlocate
    • updatedb 这个命令会先读取 /etc/updatedb.conf 中的配置信息,并根据这个配置,去硬盘里查找文件名,更新在 /var/lib/mlocate 中的记录
    • locate:依据 /var/lib/mlocate 内的数据库记录,找出包含用户输入的关键字的文件名
    • whereis:依据 /var/lib/mlocate 内的数据库记录,找到与用户输入的文件名相匹配的记录

find

find的功能非常强大,但是因为是进行硬盘检索,所以效率偏低

  • 基本用法

    find [PATH] [option] [action]
  • 与时间有关的参数

    • 参数说明

      
      # 与时间有关的参数:共有-atime、-ctime 与 -mtime,下面以-mtime说明
      
      -mtime n:n为数字,意为在n天前的“一天之内”被修改的文件
      -mtime +n:列出在n天之前(不包含n天本身)被更改过的文件
      -mtime -n:列出n天内(包含n天本身)被更改过的文件
      -newer file:file为一个存在的文件,列出比file还要新的文件
    • find时间相关参数含义图示
      find时间相关参数意义

    • 举个栗子

      
      # 将到系统上面24小时内有改动(mtime)的文件列出
      
      find / -mtime 0
      
      
      # 将到系统上面3天前的24小时内有改动(mtime)的文件列出
      
      find / -mtime 3
      
      
      # 寻找 /etc 下面的文件,如果文件的日期比 /etc/password 新就列出
      
      find /etc -newer /etc/password
  • 与用户或用户组名字有关的参数

    • 参数说明

      -uid n:n为数字,是用户的账号ID,称为UID(在/etc/password中每个账号会关联一个UID)
      -gid n:n为数字,是组的ID,称为GID(在/etc/group中每个组会关联一个GID)
      -user name:name为用户账号的名字,例如:sunny
      -group name:name为用户组名,例如:users
      -nouser:寻找文件的所有者不存在与/etc/password中的文件
      -nogroup:寻找文件的所有用户组不存在与/etc/group中的文件
    • 举个栗子

      
      # 查找 /home 下面属于 sunny的文件
      
      find /home -user sunny
      
      
      # 查找系统中不属于任何人的文件
      
      find / -nouser
    • 说明
      如果你想找到某个用户在系统下面创建了什么文件,上面介绍的方法就很适用。至于-nouser和-nogroup的参数功能,除了你*自行由网络上面下载文件时会发生外,如果你将系统里面某个账号删除了,但是该账号已经在系统内创建了若干文件,就可能会有无主文件出现!此时就可以用-nouser来找出此类文件。

  • 与文件权限及名称有关的参数

    • 参数说明

      -name filenam:查找文件名为 filename 的文件
      -size [+-]SIZE:查找比SIZE还要大(+)或小(-)的文件。SIZE的单位有:
          c:byte
          k:1024bytes
      -type TYPE:查找文件类型为TYPE的文件,主要有以下几种类型:
          f:一般正规文件
          b、c:设备文件
          d:目录
          l:连接文件
          s:socket文件
          p:FIFO文件
      -perm mode:查找文件权限刚好等于mode的文件(mode与chmod命令中用数字表示权限的写法一致)
      -perm -mode:查找文件权限包含mode中所有权限的文件
      -perm +mode:查找文件权限中包含mode中任一权限的文件
    • 举个栗子

      
      # 找到文件名为rein的文件
      
      find / -name rein
      
      
      # 找到 /home 目录下小与50KB的文件
      
      find /home -size -50k
      
      
      # 找到 /var 目录下文件类型为Socket的文件
      
      find /var -type s
      
      
      # 查找系统中所有含有SGID、SUID或SBIT属性的文件
      
      find / -perm +7000
      
      # 所谓的 7000 就是 ---s--s--t,那么只要目标权限中包含s或t就符合条件
      
      
      # 如果使用的是 -7000 则目标文件要包含 ---s--s--t 的全部三个权限才符合条件
      
  • 其他可进行的操作

    • 参数说明

      -exec command:command为其他命令,-exec后面可接其他的命令来处理查找到的结果(这个命令不支持别名)
      -print:将结果打印到屏幕上,这个操作是默认操作
    • 举个栗子

      
      # 查找系统中所有含有SGID、SUID或SBIT属性的文件,并使用ls -l 列出详细信息
      
      find /-perm +7000 -exec ls -l {} \

      该例中有两个特殊的地方,{} 以及 \

      • {}:代表的是由find找到的内容
      • \:它是一个关键字,可以理解为 -exec 参数的结束标识符。在-exec** 之间的便是find命令内的额外命令。它用另一个命令来处理find的执行结果
发布了55 篇原创文章 · 获赞 29 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_33215972/article/details/81779514