Linux学习[9]查找文件指令:which & whereis & locate & find

前言

之前在弄交叉编译的时候需要找到gcc,gdb什么的在哪里;涉及到了查找文件指令。
这里对linux中的查找指令进行总结


1. which

which指令一般用来寻找可执行文件的路径,比如我们使用的ifconfig,ls这种可执行文件指令所在的地方。

which 默认是找 PATH 内所规范的目录,所以如果我们的可执行文件的命令没有在PATH里面,那使用which无法查到。

这里举几个例子:

输入which ifconfig指令
输出/sbin/ifconfig

输入which history指令
提示/usr/bin/which: no history in (/usr/local/sbin:/usr/local/bin:/sbin:/bin: /usr/sbin:/usr/bin:/root/bin)
这里是因为history是bash内置的指令,并不在PATH中,这也侧面说明which默认是找PATH内所规范的目录。


2. whereis

whereis指令可谓好评如潮,因为相对于find指令,这个指令用起来并没有find那么太复杂,并且速度比find要快很多。
那为何搜寻的速度会比 find 快这么多? 是因为 whereis 只找几个特定的目录而已,并没有全系统去查询之故。所以说,whereis 主要是针对 /bin /sbin 下面的可执行文件, 以及 /usr/share/man 下面的 man page 文件,跟几个比较特定的目录来处理而已。所以速度当然快的多!

whereis的一般用法如下:
whereis option 文件或目录名
选项与参数option:
-l :可以列出 whereis 会去查询的几个主要目录而已
-b :只找 binary 格式的文件
-m :只找在说明文档 manual 路径下的文件
-s :只找 source 来源文件
-u :搜寻不在上述三个项目当中的其他特殊文件

举例:
whereis ifconfig

ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz


3. locate

locate也是查找的指令,只不过它需要根据系统的数据库进行查找,数据库内数据更新时间的新旧会影响到查找的结果。
因此这个东西还是有使用上的限制。你会发现使用 locate 来寻找数据的时候特别的快, 这是因为 locate 寻找的数据是由“已创建的数据库 /var/lib/mlocate/” 里面的数据所搜寻到的,所以不用直接在去硬盘当中存取数据,因此非常快。

因为他是经由数据库来搜寻的,而数据库的创建默认是在每天执行一次 ,所以当你新创建起来的文件, 却还在数据库更新之前搜寻该文件,那么 locate 会告诉你“找不到!”,所以必须要更新数据库呀。

手动更新数据库,直接输入“ updatedb ”就可以了。 updatedb 指令会去读取 /etc/updatedb.conf 这个配置文件的设置,然后再去硬盘里面进行搜寻文件名的动作, 最后就更新整个数据库文件啰!因为 updatedb 会去搜寻硬盘,所以当你执行 updatedb 时,可能会等待数分钟的时间。

指令说明:
updatedb:根据 /etc/updatedb.conf 的设置去搜寻系统硬盘内的文件名,并更新 /var/lib/mlocate 内的数据库文件;
locate:依据 /var/lib/mlocate 内的数据库记载,找出使用者输入的关键字文件名。

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

举例:

找出系统中所有与 passwd 相关的文件名,且只列出 5 个
[root@ubuntu ~]# locate -l 5 passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/usr/bin/gpasswd


4. find

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 还要新的文件文件名

举例:

寻找 /etc 下面的文件,如果文件日期比 /etc/passwd 新就列出
[root@ubuntu~]# find /etc -newer /etc/passwd
-newer 用在分辨两个文件之间的新旧关系


使用者或群组名称有关的参数:

-uid n :n 为数字,这个数字是使用者的帐号 ID,亦即 UID ,这个 UID 是记录在/etc/passwd 里面与帐号名称对应的数字。
-gid n :n 为数字,这个数字是群组名称的 ID,亦即 GID,这个 GID 记录在/etc/group,相关的介绍我们会第四篇说明~
-user name :name 为使用者帐号名称喔!例如 dmtsai
-group name:name 为群组名称喔,例如 users ;
-nouser :寻找文件的拥有者不存在 /etc/passwd 的人
-nogroup :寻找文件的拥有群组不存在于 /etc/group 的文件
当你自行安装软件时,很可能该软件的属性当中并没有文件拥有者,
这是可能的!在这个时候,就可以使用 -nouser 与 -nogroup 搜寻。

举例:

搜寻 /home 下面属于 pi的文件
[root@ubuntu~]# find /home -user pi
#这个东西也很有用的~当我们要找出任何一个使用者在系统当中的所有文件时,
#就可以利用这个指令将属于某个使用者的所有文件都找出来


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

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

举例:

找出文件名为 passwd 这个文件
[root@ubuntu~]# find / -name passwd

找出文件名包含了 passwd 这个关键字的文件
[root@ubuntu~]# find / -name “passwd
#利用这个 -name 可以搜寻文件名,默认是完整文件名,如果想要找关键字,
#可以使用类似 * 的任意字符来处理

找出 /run 目录下,文件类型为 Socket 的文件名有哪些?
[root@ubuntu~]# find /run -type s
#这个 -type 的属性也很有帮助喔!尤其是要找出那些怪异的文件,
#例如 socket 与 FIFO 文件,可以用 find /run -type p 或 -type s 来找!

搜寻文件当中含有 SGID 或 SUID 或 SBIT 的属性
[root@ubuntu~]# find / -perm /7000
#所谓的 7000 就是 —s–s–t ,那么只要含有 s 或 t 的就列出,所以当然要使用 /7000,
#使用 -7000 表示要同时含有 —s–s–t 的所有三个权限。而只需要任意一个,就是 /7000


额外可进行的动作:
-exec command :command 为其他指令,-exec 后面可再接额外的指令来处理搜寻到的结果。
-print :将结果打印到屏幕上,这个动作是默认动作!

举例说明:

将上个范例找到的文件使用 ls -l 列出来~
[root@ubuntu~]# find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} ;
#注意到,那个 -exec 后面的 ls -l 就是额外的指令,指令不支持命令别名,
#所以仅能使用 ls -l 不可以使用 ll

在这里插入图片描述

找出系统中,大于 1MB 的文件
[root@ubuntu~]# find / -size +1M

{} 代表的是“由 find 找到的内容”,如上图所示,find 的结果会被放置到 {} 位置中;
-exec 一直到 ; 是关键字,代表 find 额外动作的开始 (-exec) 到结束 (;) ,在这中间的就是 find 指令内的额外动作。 在本例中就是“ ls -l {} ”
因为“ ; ”在 bash 环境下是有特殊意义的,因此利用反斜线来跳脱。


总结:

这篇文章大体都是以书上为主,个人见解较少,因为实际运用中find暂时用的还不多,都是用whereis来替代,或者使用图形化界面来查找。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Linux中有多种用于查找文件和目录的指令,下面是对which、whereis、locate、find和grep指令的介绍以及示例: 1. which:用于查找可执行文件的路径。它会在环境变量$PATH指定的路径中搜索指定的命令,并返回第一个匹配到的完整路径。 示例:假设我们要查找命令ls的路径,可以使用以下命令: ``` which ls ``` 输出结果可能是:/bin/ls 2. whereis:用于查找二进制文件、源代码文件和帮助文档的路径。它会在特定的目录中搜索指定的文件,并返回相关信息。 示例:假设我们要查找命令ls的二进制文件、源代码文件和帮助文档的路径,可以使用以下命令: ``` whereis ls ``` 输出结果可能是:/bin/ls /usr/share/man/man1/ls.1.gz 3. locate:用于快速查找文件或目录。它会在系统预先建立的数据库中搜索匹配的文件或目录,并返回结果。 示例:假设我们要查找所有以.txt结尾的文件,可以使用以下命令: ``` locate *.txt ``` 输出结果可能是:/home/user/file1.txt /home/user/file2.txt /var/log/file3.txt 4. find:用于在指定目录下递归地搜索文件和目录。它可以根据不同的条件进行搜索,并返回匹配的结果。 示例:假设我们要在当前目录下查找所有以.txt结尾的文件,可以使用以下命令: ``` find . -name "*.txt" ``` 输出结果可能是:./file1.txt ./file2.txt ./dir1/file3.txt 5. grep:用于在文件搜索指定的模式。它可以根据正则表达式匹配文本,并返回匹配的行。 示例:假设我们要在文件file.txt中查找包含"hello"的行,可以使用以下命令: ``` grep "hello" file.txt ``` 输出结果可能是:This is a hello world example.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

澄澈i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值