常见的查找文件命令--find、locate、where、which、type

我们经常需要在系统中查找一个文件,那么在Linux系统中我们如何准确高效的确定一个文件在系统中的具体位置呢?下面我总结了在linux系统中常见的查找文件的几个命令。

一、find命令

find是最常用也是最强大的查找命令,它可以查找任何类型的文件。

find命令的一般格式为:find <指定目录><指定条件><指定动作>,即find pathname -options [-print -exec -ok]

参数解释:

pathname:pathname为搜索的目录及其子目录,默认情况下为当前目录

常用的option选项:

-name:按文件名来查找文件

-user:按照文件的属主来查找文件

-group:按照文件所属的组来查找文件

-perm:按照文件权限来查找文件

-prune:不在当前指定目录中查找

例如:已知在/etc,/etc/pam.d以及/user/bin目录下都有一个名为passwd的文件,我们看一下-prune的作用

find -name "passwd"  ## 为在当前目录及其子目录下下查找名为passwd的文件
find . -path ./etc -prune -o -name "passwd" -print  ##为在当前目录及其子目录(除了/etc目录及其子目录)下查找名为passwd的文件。
find . -path ./etc -prune -o -name "passwd"  ##区别带-print参数与不带-print参数
find . -path ./usr -prune -o -name "passwd" -print  ##为在当前目录及其子目录(除了/usr目录及其子目录)下查找名为passwd的文件。
find / \( -path /usr/bin -o -path /etc \) -prune -o -name "passwd" -print  ##为在当前目录及其子目录(除了/usr/bin目录及其子目录;/etc目录及其子目录)下查找名为passwd的文件。由于命令行不能直接识别圆括号,因此要用转义字符\,在和前后都要有空格。

注意:find命令不加任何参数时,表示搜索路径为当前目录及其子目录,默认的动作为-print,即不过滤任何结果,也就是说输出所有的文件。

-mtime -n +n:按照文件修改时间来查找文件,-n表示文件修改时间距现在n天以内,+n表示文件修改时间据现在n天以前

-type:查找某一类型的文件(b:块设备文件;d:目录文件;c:字符设备文件;p:管道文件;l:链接文件;f:普通文件)

-nogroup:查找无有效所属组的文件,即文件所属的组在/etc/group中不存在

-nouser;查找无有效所属主的文件,即文件的所属主在/etc/passwd中不存在

想了解具体的find命令使用,可以参考这两篇博客:

Linux中find命令-path -prune用法详解

Linux下find命令详解

二、locate命令

locate命令实际是"find -name"的另一种写法,但是查找方式跟find不同,它比find快得多。因为它不搜索具体目录,而是在一个数据库(/var/lib/mlocate/mlocate.db)中搜索指定的文件。次数据库含有本地文件的所有信息,此数据库是linux系统自动创建的,数据库由updatedb程序来更新,updatedb是由cron daemon周期性建立的,默认情况下为每天更新一次,所以用locate命令你搜索不到最新更新的文件,除非你在用locate命令查找文件之前手动的用updatedb命令更新数据库。

1、locate安装

yum install mlocate -y
updatedb
locate 文件名 #使用方法

2、查询系统上预建的文件索引数据库

ll  /var/lib/mlocate/mlocate.db

3、依赖于事先构建的索引

索引的构建是在系统较为空闲时自动进行( 周期性任务),管理员手动更新数据库(updatedb),索引构建过程需要遍历整个根文件系统,极消耗资源

4、工作特点:

  • 查找速度快

  • 模糊查找

  • 非实时查找

  • 搜索的是文件的全路径,不仅仅是文件名

  • 可能只搜索用户具备读取和执行权限的目录

5、locate 参数

-i:执行不区分大小写的搜索

-n N:只列举前N 个匹配项目

-b:只匹配路径中的基名

-c:只显示统计多少个符合条件的路径

-r:能基于基本正则表达式来编写命令

locate foo             #搜索名称或路径中带有“foo ”的文件
locate -r ‘.foo$’      #使用Regex 来搜索以“.foo ”结尾的文件

注意每次有新文件更新和删除之后,在updatedb之前数据库中保存的文件信息不会改变,即新添加一个文件之后,updatedb之前用locate搜索不到指定的文件。同样再删除一个文件信息已经在数据库中的文件时,updatedb之前用locate照样能搜索到该文件的信息,,尽管此时该文件已经不存在了。

3、whereis命令

查找符合条件的文件,这些文件的烈性应属于源代码文件(-s)二进制代码文件(-b),或是说明文件(-m),只能用于程序名的搜索。如果省略参数则返回所有的信息。 

whereis --help
whereis find
whereis -b find
whereis -m find
whereis -s find

Options:
 -b         search only for binaries
 -B <dirs>  define binaries lookup path
 -m         search only for manuals
 -M <dirs>  define man lookup path
 -s         search only for sources
 -S <dirs>  define sources lookup path
 -f         terminate <dirs> argument list
 -u         search for unusual entries
 -l         output effective lookup paths

4、which命令

在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果,可以知道系统命令是否存在,以及执行的到底是哪个位置 (PATH区别大小写)

5、type命令

type命令主要用于区分一个命令到底是shell自带的还是外部独立的二进制文件提供的。如果是shell自带的则会提示此命令为shell buildin,否则会列出命令的位置。

例如:cd为shell自带的命令,当用which查找时,which会按照PATH变量设置的路径进行搜索,结果显示no cd in...;用type cd则显示cd为shell buildin命令。ssh不是shell自带命令,用type时会显示ssh的路径。

参考博客:https://zhuanlan.zhihu.com/p/50676440

发布了87 篇原创文章 · 获赞 208 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/l_liangkk/article/details/104031797