【Linux】查找命令——which,type,find,whereis,locate

命令与文件的查找

        文件的查找可就厉害了,因为我们常常需要知道哪个文件放在哪里,才能够对该文件进行一些修改或维护等操作。

有时候某些软件配置文件的文件名是不变的,但是各Linux发行版放置的目录则不同。

此时就要利用一些查找命令将该配置文件的完整文件名找出来,这样才能修改,您说是吧!

1.脚本文件的查找

        我们知道在命令行模式当中,连续输入两次[Tab]按键就能够知道用户有多少命令可以执行。那你知不知道这些命令的完整文件名放在哪里?

举例来说,Is 这个常用的命令放在哪里?可以通过which或type来查找。

1.1.which

which(查找【执行文件】)

选项或参数:

  • -a:将所有由PATH目录中可以找到的命令均列出,而不止第一个被找到的命令名称.

范例一:查找 ifconfig 这个命令的完整文件名。

范例二:用which 去找出 which的文件名是什么?

竟然会有两个 which,其中一个是 alias 这玩意儿。那是啥?那就是所谓的【命令别名】意思是输入which 会等于后面接的那串命令

范例三:请找出 history 这个命令的完整文件名.

# 什么?怎么可能没有history,我明明就能够用root 执行history.

        这个命令是根据【PATH】这个环境变量所规范的路径,去查找执行文件的文件名,所以,重点是找出执行文件而已,且which后面接的是完整文件名。若加上-a选项,则可以列出所有的可以找到的同名执行文件,而非仅显示第一个而已。

        最后一个范例最有趣,怎么history 这个常用的命令竟然找不到。为什么?

        这是因为history 是bash 内置的命令。但是which 默认是找PATH内所设置的目录,所以当然一定找不到的(有bash就有history )。那怎么办?没关系,我们可以通过type这个命令。

1.2.type

        请你在shell的环境下,直接输入man  bash 看一看,嘿嘿,不是盖的吧!让你看个几天几夜也无法看完的bash说明文件,可是很详细的文档。

        不过,在这个bash 的man page当中,不知道你是否有察觉到,咦?怎么这个说明文件里面有其他命令的说明?

        举例来说,那个cd命令的说明就在这个man page内? 然后我直接输入man cd时,怎么出现的画面中,最上方竟然出现一堆命令的介绍?这是怎么回事?

为了方便shell的操作,其实bash已经内置了很多命令,例如上面提到的cd,还有例如umask等命令,都是内置在bash中。

        那我怎么知道这个命令是来自于外部命令(指的是其他非bash所提供的命令)或是内置在bash中呢?嘿嘿,利用type这个命令来观察即可,举例来说:

[dmtsai@study ~]$ type [-tpa] name

选项与参数:

  • 不加任何选项与参数时,type 会显示出 name 是外部命令还是 bash 内置命令;

当加入-t 参数时,type 将 name 以下面这些字眼显示出它的意义:

  • file:表示为外部命令
  • alias :表示该命令为命令别名所设置的名称;
  • builtin:表示该命令为bash内置的命令功能;

-p:如果后面接的name为外部命令时,才会显示完整文件名;

-a:会由 PATH变量定义的路径中,将所有含 name 的命令都列出来,包含 alias;

范例一:查询一下ls 这个命令是否为 bash 内置?

范例2,那么cd是不是内置命令

范例3,history是不是内置命令

2.文件的查找

再来谈一谈怎么查找文件吧!

在Linux下面也有相当优异的查找命令,通常find不很常用。除速度慢之外,也影响硬盘性能。一般我们都是先使用whereis或locate来查找。为什么?

因为whereis只找系统中某些特定目录下面的文件而已,locate则是利用数据库来查文件名,当然两者就相当的快速,并且没有实际查找硬盘内的文件系统状态,比较省时间。

2.1.whereis(由一些特定的目录中查找文件)

[root@study-J#whereis  [-bmsu]  文件或目录名

选项与参数:

  • -l:可以列出whereis会去查询的几个主要目录;
  • -b:只找binary(二进制)格式的文件(也就是可执行文件);
  • -m:只找在说明文件manual(即man手册)路径下的文件;
  • -s:只找source源文件;
  • -u:查找不在上述三个项目当中的其他特殊文件;

范例一:请找出ifconfig这个文件名。

范例二:只找出跟passwd 有关的【说明文件】文件名(man page)。

加了-m选项,只会显示在man手册里的文件名

        等一下我们会提到 find 这个查找命令,find是很强大的查找命令,但是所用时间很多。(因为find是直接查找硬盘,如果你的硬盘比较老旧的话,嘿嘿,有的等。)

        这个时候whereis就相当好用了。另外,whereis 可以加入选项来查找相关的数据,例如,如果你是要找可执行文件(binary),那么加上-b就可以。如果不加任何选项的话,那么就将所有的数据显示出来。

        那么whereis到底使用什么东西?为何查找的速度会比 find快这么多?其实也没有什么,只是因为whereis只找几个特定的目录而已,并没有全系统去查询之故。

所以说,whereis 主要是针对/bin/sbin下面的执行文件,以及/usr/share/man下面的man page文件,跟几个比较特定的目录来处理而已,所以速度当然快得多。

不过,有某些文件是你找不到的。想要知道whereis到底查了多少目录?可以使用whereis-l来确认一下。

这里只截取了一小部分

2.2.locate / updatedb

[root@study ~J# locate [-ir] keyword

选项与参数:

  • -i:忽略大小写的差异;
  • -c:不输出文件名,仅计算找到的文件数量;
  • -l:仅输出几行的意思,例如输出五行则是-l 5;
  • -S:输出1ocate所使用的数据库文件的相关信息,包括该数据库记录的文件/目录数量等:
  • -r:后面可接正则表达式的显示方式;

范例一:找出系统中所有与passwd相关的文件名,且只列出5个.

没找到?看来是我们没有安装locate命令

sudo yum install mlocate

???又发生什么了,这是我们数据库没有创建或者更新,我们运行sudo updatedb来创建或者更新数据

 

范例二:列出locate查询所使用的数据库文件之文件名与各数据数量

 

这个locate的使用更简单,直接在后面输入文件的部分名称后,就能够得到结果。

        举上面的例子来说,我输入locate passwd,那么在完整文件名(包含路径名称)当中,只要有 passwd在其中就会被显示出来。这也是个很方便好用的命令,尤其是在你忘记某个文件的完整文件名时。

但是,这个东西还是有使用上的限制。为什么?

        你会发现使用locate来寻找数据特别快,这是因为locate 寻找的数据是由已建立的数据库/var/lib/mlocate/里面的数据所查找到的,所以不用直接再去硬盘当中读取数据,呵呵,当然是很快速的。

        那么有什么限制?就是因为它是经由数据库来查找的,而数据库的建立默认是在每天执行一次(每个Linux发行版都不同,CentOS 7.x是每天更新数据库一次),所以当你新建立起来的文件,却还在数据库更新之前查找该文件,那么 locate会告诉你【找不到】呵呵,因为必须要更新数据库呀!

        那能否手动更新数据库?

当然可以,更新 locate 数据库的方法非常简单,直接输入【sudo updatedb】就可以。updatedb 命令会去读取/etc/updatedb.conf 这个配置文件的设置,然后再去硬盘里面进行查找文件名的操作,最后就更新整个数据库文件。因为updatedb会去查找硬盘,所以当你执行updatedb时,可能会等待数分钟的时间。

  • updatedb:根据/etc/updatedb.conf的设置去查找系统硬盘内的文件,并更新/ar/ib/mlocate内的数据库文件;
  • locate:依据/var/ib/mlocate内的数据库记录,找出用户所输入关键词的文件名。

2.3.find

find [PATH] [option] [action]

选项与参数:

2.3.1.与时间有关的选项:

共有-atime、-ctime,-mtime,以-mtime说明

  • -mtime n:n为数字,意义为在第n天之前的【第n天前的那一天之内】被修改过内容的文件;
  • -mtine +n:列出在n天之前(不含n天本身)被修改过内容的文件;
  • -mtime -n:列出在n天之内(含 n天本身)被修改过内容的文件;
  • -newer file :file 为一个存在的文件,列出比 file 还要新的文件

:范例一:将过去系统上面 24小时内有修改过内容(mtime)的文件列出。

那个 0是重点。0代表目前的时间,所以从现在开始到 24 小时前,有变动过内容的文件都会被显示。


那如果是三天前那一天的24小时内?

# find / -mtime 3有变动过的文件都被显示的意思。

范例二:寻找/etc 下面的文件,如果文件日期比/etc/passwd新就列出

-newer 用在辨别两个文件之间的新旧关系是很有用的。

有些文件的查询是需要root权限的

        时间参数真是挺有意思的。我们现在知道atime、ctime与mtime的意义,如果你想要找出一天内被修改过的文件,可以使用上述范例一的做法。

  • 但如果我想要找出4天内被修改过的文件?那可以使用【 find /var -mtime -4】。
  • 那如果是4天前的那一天就用【find /var -mtime 4 】

有没有加上【+,-】差别很大。我们可以用简单的图例来说明一下:

图中最右边为目前的时间,越往左边则代表越早之前的时间轴,由图6.5.1我们可以清楚的知道:

  • +4 代表大于等于5天前的文件:ex> find /var-mtime+4
  • -4 代表小于等于4天内的文件:ex> find /var一mtime-4
  • 4则是代表4-5那一天的文件:ex> find /var-mtime 4

非常有趣吧!你可以在/var/目录下查找一下,感受一下输出文件的差异,再来看看其他find的用法。

2.3.2.与使用者或用户组名称有关的参数:

  • -uid n:n为数字,这个数字是使用者的账号ID,亦即UID、这个UID是记录在/etc/passwd里面账号名称对应的数字。
  • -gid n:n为数字,这个数字是用户组名称的ID,亦即GID,这个 GID记录在/etc/group
  • -user name:name 为使用者账号名称,例如bcq_113.
  • -group name: name 为用户组名称,例如users;
  • -nouser:查找文件的拥有用户组不存在于/etc/passwd中
  • -nogroup:查找文件的拥有用户组不存在于/etc/group的文件。当你自行安装软件时,很可能该软件的属性当中并没有文件拥有者,这是可能的。在这个时候,就可以使用-nouser与-nogroup查找。

范例三:查找/home 下面属于zs_108的文件。

这个东西也很有用的,当我们要找出任何一个用户在系统当中的所有文件时,就可以利用这个命令将属于某个用户的所有文件都找出来。

范例四:查找系统中不属于任何人的文件。

通过这个命令,可以轻易的就找出那些不太正常的文件。如果有找到不属于系统任何用户的文件时,不要太紧张,那有时候是正常的,尤其是你曾经以源代码自行编译软件时。

        如果你想要找出某个用户在系统下面建立了啥东西,使用上述的选项与参数,就能够找出来。至于那个-nouser 或-nogroup的选项功能中,除了你自行由网络上面下载文件时会发生之外,如果你将系统里面某个账号删除了,但是该账号已经在系统内放了很多文件时,就可能会产生“无主孤魂”的文件存在。此时你就得使用这个-nouser 来找出该类型的文件。

2.3.3.与文件权限及名称有关的参数:

  • -name filename:查找文件名称为filename 的文件;
  • -size [+-]SIZE:查找比 SIZE还要大(+)或小(-)的文件。这个SIZE的规格有:c:代表 Bytes,k:代表 1024Bytes。所以,要找比 50KB 还要大的文件,就是【-size +50k】
  • -type TYPE:查找文件的类型为TYPE的,类型主要有:一般正规文件(f),设备文件(b,c),目录,socket(s),及FIFO(p)等属性。
  • -perm mode:查找文件权限【刚好等于】mode 的文件,这个mode 为类似 chmod的属性值,举例来查找文件权限【必须要全部囊括 mode 的权限】的文件,举例来说,我们要查找-rwxr-使用-perm -0744,当一个文件的权限为-rwsr-xr-x,亦即也会被列出来,因为-rwsr-xr-x的属性已经囊括了-rwxr--r--的属性了。
  • -perm /mode:查找文件权限【包含任—mode 的权服】的文件,举例来说,我们查找-rwxr-xr-x,亦即-perm /755,但一个文件属性为-rw-------也会被列出来,因为它有-rw...的属性存在。

范例五:找出文件名为passwd这个文件。

 范例五-1:找出文件名包含了passwd 这个关键字的文件。

利用这个-name 可以查找文件名.
可以使用类似*的任意字符来处理。
默认是完整文件名,如果想要找关键字,

范例六:找出/run 目录下,文件类型为 socket 的文件名有哪些?

+这个-type的属性也很有帮助。尤其是要找出那些怪异的文件。
例如socket 与FIFO文件,可以用 find /run -type p或-type s来找。

范例七:查找文件当中含有 SGID、SUID 或 SBIT的属性。


所谓的7000就是---s--s--t,那么只要含有s或t的就列出,所以当然要使用-perm /7000

使用/7000,---s--s--t 的所有三个权限,如果只需要任意一个,就是/7000,了解了吗?

上述范例中比较有趣的就属-perm这个选项,它的重点在找出特殊权限的文件。

我们知道 SUID与SGID 都可以设置在二进制程序上,假设我想要找出来/usr/bin、/usr/sbin这两个目录下,只要具有SUID或SGID就找到该文件,你可以这样做:

[root@study ~]# find /usr/bin /ust/sbin -perm /6000

因为SUID是4,SGID2,总共为6,因此可用/6000来处理这个权限,至于find后面可以接多个目录来进行查找。另外,find本来就会查找子目录,这个特色也要特别注意。最后,我们再来看一下find还有什么特殊功能吧!

2.3.4.额外可进行的操作:

  • -exec command :command 为其他命令,-exec 后面可再接额外的命令来处理查找到的结果.
  • -print:将结果打印到屏幕上,这个操作是默认操作.

范例八:将上个范例找到的文件使用ls-l列出来。

#注意到,那个-exec 后面的 ls -l 就是额外的命令,命令不支持命令别名,所以仅能使用ls -l不可以使用ll,注意注意。

范例九:找出系统中,大于 1MB 的文件。

find的特殊功能就是能够进行额外的操作(action)。

我们将范例八的例子以图例来说明如下:
该范例中特殊的地方有{}以及\;还有—exec这个关键词,这些东西的意义为:

  • {}代表的是由find找到的内容,如上图所示,find的结果会被放置到{}位置中;
  • -exec一直到\;是关键词,代表find 额外操作的开始(-exec)到结束(\;),在这中间的就是find命令内的额外操作。在本例中就是【Is-l{}】;
  • 因为【;】在bash环境下是有特殊意义的,因此利用反斜杠来转义;

通过图6.5.2你应该就比较容易了解—exec到\;之间的意义了吧!


如果你要找的文件是具有特殊属性的,例如SUID文件拥有者、文件大小等,那么利用locate 没有办法完成你的查找,此时find就显得很重要。

另外,find还可以利用通配符来查找文件名。

举例来说,你想要找出/etc下面文件名包含httpd的文件,那么你就可以这样做:

[root@study~]# find /etc -name '*httpd*'

不但可以指定查找的目录(连同子目录),并且可以利用额外的选项与参数来找到最正确的文件名,真是很好用。

不过由于find在查找数据的时候相当消耗硬盘资源,所以没事不要使用find。有更棒的命令可以使用,那就是上面提到的whereis与locatea
 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

25.【C语言】循环结构之for 上

1.基本使用 类比while 在while循环中&#xff0c;有三个不可或缺的部分&#xff1a;初始化&#xff0c;判断部分&#xff0c;调整部分 int i 0;//初始化 while (i < 10)//判断部分 {……i;//调整部分 }三个部分太分散&#xff0c;用for循环可集为一体&#xff0c;简洁 …

使用shell脚本实现DM8开机自动启动

编写shell脚本 #!/bin/bashsu -dmdba >>EOF cd /home/dmdba/dmdbms/bin ./DmServiceDMTEST start echo "dm start ... " EOF注意&#xff1a;DmServiceDMTEST每个服务器设置的不一样&#xff0c;根据实际进行更换 授权脚本可执行权限 chmod -x /dmdata/dmse…

搭建互联网医院实战:从源码到在线问诊APP的全流程开发

今天&#xff0c;笔者将讲述在线问诊APP的全流程开发&#xff0c;帮助开发者理解和掌握搭建互联网医院的核心技术和步骤。 一、需求分析与设计 需求分析包括明确目标用户、功能需求、性能需求等。设计阶段则包括系统架构设计、数据库设计和前后端界面设计等。 1.目标用户&…

最小权顶点覆盖问题-优先队列分支限界法-C++

问题描述: 给定一个赋权无向图 G(V,E)&#xff0c;每个顶点 v∈V 都有一个权值 w(v)。如果 U⊆V&#xff0c;U⊆V&#xff0c;且对任意(u,v)∈E 有 u∈U 或 v∈U&#xff0c;就称 U 为图 G 的一个顶点覆盖。G 的最小权顶点覆盖是指 G 中所含顶点权之和最小的顶点覆盖。对于给定…

提取重复数据

直接上控制台代码&#xff1a; Module Module1Sub Main()Console.WriteLine("请输入数据&#xff0c;以""&#xff0c;""相隔&#xff1a;")Dim str As String Console.ReadLineDim result From x In str.Split(",")Group By x Int…

NTP协议格式解析

1. NTP时间戳格式 SNTP使用在RFC 1305 及其以前的版本所描述标准NTP时间戳的格式。与因特网标准标准一致&#xff0c; NTP 数据被指定为整数或定点小数&#xff0c;位以big-endian风格从左边0位或者高位计数。除非不这样指定&#xff0c;全部数量都将设成unsigned的类型&#…

Android Graphics 显示系统 - 监测、计算FPS的工具及设计分析

“ 在Android图像显示相关的开发、调试、测试过程中&#xff0c;如何能有效地评估画面的流畅度及监测、计算图层渲染显示的实时FPS呢&#xff1f;本篇文章将会提供一种实用、灵巧的思路。” 01 设计初衷 面对开发测试中遇到的卡顿掉帧问题&#xff0c;如何在复现卡顿的过程中持…

代码随想录算法训练营第四十五天| 300.最长递增子序列、 674. 最长连续递增序列、 718. 最长重复子数组

300.最长递增子序列 题目链接&#xff1a;300.最长递增子序列 文档讲解&#xff1a;代码随想录 状态&#xff1a;不会&#xff0c;递推状态的时候只想着如何从dp[i-1]推导dp[i]&#xff0c;没想过可能需要枚举dp[0-i] 思路&#xff1a; 找出所有比自己小的数字的dp[j],在这些dp…

SpringBoot 实现视频分段播放(通过进度条来加载视频)

需求&#xff1a;现在我本地电脑中有一个文件夹&#xff0c;文件夹中都是视频&#xff0c;需要实现视频播放的功能。 问题&#xff1a;如果通过类似 SpringBoot static 文件夹的方式来实现&#xff0c;客户端要下载好完整的视频之后才可以播放&#xff0c;并且服务端也会占用大…

秋招突击——7/5——设计模式知识点补充——适配器模式、代理模式和装饰器模式

文章目录 引言正文适配器模式学习篮球翻译适配器 面试题 代理模式学习面试题 装饰器模式学习装饰模式总结 面试题 总结 引言 为了一雪前耻&#xff0c;之前腾讯面试的极其差&#xff0c;设计模式一点都不会&#xff0c;这里找了一点设计模式的面试题&#xff0c;就针对几个常考…

计算机图形学入门24:材质与外观

1.前言 想要得到一个漂亮准确的场景渲染效果&#xff0c;不只需要物理正确的全局照明算法&#xff0c;也要了解现实中各种物体的表面外观和在图形学中的模拟方式。而物体的外观和材质其实就是同一个意思&#xff0c;不同的材质在光照下就会表现出不同的外观&#xff0c;所以外观…

代理模式的实现

1. 引言 1.1 背景 代理模式&#xff08;Proxy Pattern&#xff09;是一种常用的设计模式&#xff0c;它允许通过一个代理对象来控制对另一个对象的访问。在面向对象编程的框架中&#xff0c;代理模式被广泛应用&#xff0c;尤其在Spring框架的AOP&#xff08;面向切面编程&am…

Springboot学习之用EasyExcel4导入导出数据(基于MyBatisPlus)

一、POM依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><m…

AI Earth应用—— 在线使用sentinel数据VV和VH波段进行水体提取分析(昆明抚仙湖、滇池为例)

AI Earth 本文的主要目的就是对水体进行提取,这里,具体的操作步骤很简单基本上是通过,首页的数据检索,选择需要研究的区域,然后选择工具箱种的水体提取分析即可,剩下的就交给阿里云去处理,结果如下: 这是我所选取的一景影像: 详情 卫星: Sentinel-1 级别: 1 …

基于机器学习(支持向量机,孤立森林,鲁棒协方差与层次聚类)的机械振动信号异常检测算法(MATLAB 2021B)

机械设备异常检测方法流程一般如下所示。 首先利用传感器采集机械运行过程中的状态信息&#xff0c;包括&#xff0c;振动、声音、压力、温度等。然后采用合适的信号处理技术对采集到机械信号进行分析处理&#xff0c;提取能够准确反映机械运行状态的特征。最后采用合理的异常决…

C++ 什么是虚函数?什么是纯虚函数,以及区别?(通俗易懂)

&#x1f4da; 当谈到虚函数时&#xff0c;通常是指在面向对象编程中的一种机制&#xff0c;它允许在派生类中重写基类的函数&#xff0c;并且能够通过基类指针或引用调用派生类中的函数。 目录 前言 &#x1f525; 虚函数 &#x1f525; 纯虚函数 &#x1f525; 两者区别…

mac|idea导入通义灵码插件

官方教程&#xff1a;通义灵码下载安装指南_智能编码助手_AI编程_云效(Apsara Devops)-阿里云帮助中心 下载插件&#xff1a; ⇩ TONGYI Lingma - JetBrains 结果如下&#xff1a; 选择apply、ok&#xff0c;会出现弹窗&#xff0c;点击登录 可以实现&#xff1a;生成单元测…

《C++20设计模式》代理模式

文章目录 一、前言二、实现1、UML类图2、实现 一、前言 这代理模式和装饰器模式很像啊。都是套一层类。&#x1f630; 主要就是功能差别 装饰器&#xff1a; 为了强化原有类的功能。代理模式&#xff1a; 不改变原有功能&#xff0c;只是强化原有类的潜在行为。 我觉的书上有…

【基于R语言群体遗传学】-8-代际及时间推移对于变异的影响

上一篇博客&#xff0c;我们学习了在非选择下&#xff0c;以二项分布模拟遗传漂变的过程&#xff1a;【基于R语言群体遗传学】-7-遗传变异&#xff08;genetic variation&#xff09;-CSDN博客 那么我们之前有在代际之间去模拟&#xff0c;那么我们就想知道&#xff0c;遗传变…

KVM虚机调整磁盘大小(注:需重启虚拟机)

1、将磁盘大小由15G调整为25G [rootkvm ~]# virsh domblklist kvm-client #显示虚拟机硬盘列表 [rootkvm ~]# qemu-img resize /var/lib/libvirt/images/tesk-disk.qcow2 10G #扩容 [rootkvm ~]# qemu-img info /var/lib/libvirt/images/test-disk.qcow2 #查看信息 注&…