Linux的文件的查找(which,type,whereis,locate,find)

文章目录

  • Linux的命令与文件的查找
    • 脚本文件的查找
      • which
      • which使用案例
      • type
    • 文件的查找
      • whereis
        • 使用案例
      • locate /updatedb
        • locate使用案例
        • updatedb
      • find
        • find命令与时间选项参数及使用案例
        • find命令与使用者或用户组名称有关的参数及使用案例
        • find命令与文件权限有关的参数及使用案例
        • find命令与额外可进行操作的选项参数及使用案例
  • 总结

Linux的命令与文件的查找

文件查找就很厉害了,因为我们常常需要知道哪个文件放在哪里,才能够对该文件进行一些修改或维护等等的操作,有时候某些软件配置文件的文件名是不变的,但是各Linux发行版放置的目录则不同,此时就需要利用一些查找命令将该配置文件的完整文件名找出来,这样才能够修改他

脚本文件的查找

我们知道在命令行模式当中,连续输入两次[TAB]按键就能够知道提示命令,那你知道这么命令的完整文件名放在哪里吗?举个例子,例如cat,这个常用的命令放在哪里?那我们就可以通过which命令来查找

which

在 Linux 系统中,which 命令用于查找可执行文件的路径。它会在环境变量 $PATH 指定的路径中查找指定的命令,并输出该命令的可执行文件路径。

[root@localhost ~]# $PATH
 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

使用 which 命令的语法格式如下:

which [-a] command

# command 表示要查找的命令名,options 表示可选参数
选项:
-a:显示所有符合条件的命令路径,而不是只输出第一个命令的路径。

which使用案例

假设我们要查找命令 python的可执行文件路径,可以使用如下命令:

[root@localhost ~]# which python
/usr/bin/python

# 该命令会在 $PATH 环境变量指定的路径中查找 python 

查看所有匹配到的路径

[root@localhost ~]# which -a mkdir
/usr/bin/python

# 该命令会返回所有匹配到的python可执行文件路径

用which去招出which的文件名是什么?

[root@localhost home]# which which
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
        /usr/bin/alias
        /usr/bin/which

# 当你执行"which which"命令时,系统会在$PATH路径中查找which命令的路径,并输出到终端。但是,由于which命令被设置为一个别名,它实际上是一个shell内置命令,而不是一个独立的可执行文件。因此,使用"which which"命令查找which命令的实际路径时,会输出该别名的定义,而不是which命令的路径。

在这种情况下,如果你想确定which命令的实际路径,可以使用"type which"命令,它会输出which命令的类型,例如是一个可执行文件还是一个别名。如果which命令是一个别名,你可以使用"alias which"命令查看该别名的定义。

type

type命令是一个用于查找命令类型的工具,它可以用来查询系统中某个命令的类型,即是一个可执行文件、内置命令、别名、shell函数等。type命令的语法如下:

type [-afptP] name

# name是要查询类型的命令名称
# 选项
-a:显示所有符合条件的命令,而非只显示第一个;
-f:仅显示文件名;
-p:仅显示找到的第一个可执行文件的完整路径;
-t:仅显示命令类型;
-P:指定要查找的命令路径前缀。

type命令会根据命令类型的不同,输出不同的信息

如果命令是一个可执行文件,type命令会输出该文件的完整路径

如果命令是一个内置命令,type命令会输出"builtin"

如果命令是一个别名,type命令会输出该别名的定义

如果命令是一个shell函数,type命令会输出该函数的定义

如果命令不存在,type命令会输出"not found"

举个例子

执行"type cd"命令会输出"cd is a shell builtin",因为cd是一个shell内置命令

image-20230408212939928

执行"type ls"命令会输出"ls is /usr/bin/ls",因为ls是一个可执行文件

image-20230408212847052

执行"type which"命令会输出"which is aliased to `alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde,因为which是一个别名

image-20230408212903570

文件的查找

Linux也有相当优异的查找命令,例如find,locate,whereis命令,我们一般都使用 locate和whereis来查找,为什么不用find呢?因为find不恨常用,除速度慢之外也很影响硬盘性能,whereis只找系统中某些特定目录下的文件而已,locate则是利用数据库来查找文件名,二者查找起来就相当的快速,其实这两个命令并没有实际查找硬盘内的文件系统状态,所以比较节省时间

whereis

whereis 命令可以用于查找指定命令的二进制文件、帮助文件和源代码文件的路径。它只能查找系统中已经安装的软件,而且只能查找特定类型的文件

简而言之就只能查找特定类型的文件

whereis 命令的基本语法如下:

whereis [-bmsu] 文件或目录名

选项:
-l      可以列出whereis会取查询的几个主要目录
-b      只查找二进制格式的文件
-m      只查找说明文件manual路径下的文件
-s      只查找source源文件
-u      查找不在上个三个项目当中的其他特殊文件

使用案例

请找出cat这个文件名

[root@localhost ~]# whereis cat
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz

只找出passwd相关的【说明文件】

[root@localhost ~]# whereis -m  passwd
passwd: /usr/share/man/man1/passwd.1.gz

locate /updatedb

locate 和 updatedb 命令是 Linux 系统中常用的文件查找命令。其中,locate 命令用于在文件索引数据库中查找文件,速度快但是可能不是最新的;updatedb 命令用于更新文件索引数据库,以便 locate 命令可以查找到最新的文件。

locate 命令的基本语法如下:

locate [-ir] 需要查找的文件名关键字

选项:
-i      忽略大小写
-c      不输出文件名,仅计算找到的文件数量
-l      仅输入几行的意思,例如输出5行 就是-l 5
-S      输入locate所使用的数据库文件的相关信息,包括该数据库记录的文件/目录数量等
-r      使用正则表达式进行匹配

locate使用案例

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

[root@localhost ~]# locate  -l 5 passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/opt/centos/Packages/passwd-0.79-6.el7.x86_64.rpm

查询所使用的数据库文件和文件名以及各数数据数量

[root@localhost ~]# locate  -S
数据库 /var/lib/mlocate/mlocate.db:
        4,641 文件夹
        39,197 文件
        1,739,831 文件名中的字节数
        884,125 字节用于存储数据库

可以看出locate的使用更简单,直接在后输入文件的部分名称后,就能够得到结果,尤其是你忘记完整的文件名时,通过搜索这样能够大大提高我们的工作效率。

但是你会发现locate在使用上面还是有限制的,为什么呢?你会发现使用locate来寻找数据特别快,这是因为locate寻找的数据是由已建立的数据库 /var/lib/mlocate/ 里面的数据所查到的,所以不要直接再去硬盘当中去读取数据,就这是locate快的原因

那么有什么限制呢?因为他是经过数据库来查找的,而数据库的建立默认是在每天执行一次(每个发行版不一样,Centos7.x是每天更新数据一次),所以当你新建立起来的文件,却还在数据库更新之前查找该文件,那么locate会告诉你找不到,这时候我们就要用到了updatedb命令

updatedb

updatedb 命令用于更新文件索引数据库,以便 locate 命令可以查找到最新的文件

使用方法有很简单

updatedb

# 就可以更新了!

find

find [path] [option] [action]

# path 表示要查找的起始路径,可以是绝对路径或相对路径;
# option 表示选项参数
# action 表示查找条件,可以是文件名、大小、权限等。

find命令与时间选项参数及使用案例

选项与参数:

与时间有关的选项:共有-atime,-ctime与-mtime,以mtime说明

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

使用案例

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

find / -mtime 0

# 那个0是重点,0代表目前的时间,所以,从现在开始到24小时前

有变动的文件都会被显示,那如果三天前那一天的24小时内呢?

find / -mtime 3

# 3天前的当天有发生改变的文件都会显示

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

find /etc -newer /etc/passwd

# newer用于辨别两个文件的新旧关系还是有点用的

以上就是时间参数选项的使用案例,如果你想要找出一天内被修改的文件,可以使用上述命令。但是如果想要找出4天前被修改过的文件?那可以使用find /etc -mtime -4,那如果是4天前的那一天就可以用find /etc -mtime 4,有没有加上[ + ,-]差别很大。我们可以用简单的图例来说明一下。

Linux的文件的查找(which,type,whereis,locate,find)_第1张图片

图中最右边为目前时间,越往左边则代表越早时间

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

find命令与使用者或用户组名称有关的参数及使用案例

选项参数:

选项参数 解释
-uid n n为数字,这个数字是使用者的账户ID,即为UID,这个UID是记录在/etc/passwd里面
-gid n n为数字,这个数字是用户组的名称的ID,即为GID,这个GID记录在/etc/group 里面
-user name name为使用者账号的名称 例如 csq
-group name name为用户组名称 例如 admin,user
-nouser 查找文件中拥有者不在/etc/passwd 中的
-nogroup 查找文件的拥有用户组不存在于 /etc/group的文件

使用案例

查找/home 下面属于zhw的文件

find /home -user zhw

# 这个命令很有用,当我们要找出任何一个用户在系统中的所有文件时,就可以利用这个命令

查找系统中不属于任何人的文件

find  / -nouser

# 通过这个命令就可以找出那些不太正常的文件,如果有找到不属于任何系统任何用户的文件时,那是正常,除了你自行在网络上面下载文件时会发生意外,还有就是系统某个账号删除了,但是账号里面有很多文件,就会发送这种情况文件不属于任何人任何系统,这时就可以通过上述命令来进行查看

find命令与文件权限有关的参数及使用案例

选项与参数

选项与参数 解释
-name filename 查看文件名称为filename的文件
-size [+ -]SIZE 查找比SIZE还要大(+)或小(-)的文件
-type TYPE 查找文件的类型为TYPE的
  • -perm mode:查找权限为指定mode的文件,例如,find /etc -type f -perm 644表示查找权限为rw-r–r–的文件。
  • -perm -mode:查找权限包含指定mode的文件,,find /etc -type f -perm -022表示查找权限包含其他用户可读写的文件。
  • -perm /mode:查找权限包含指定mode任意一位的文件。例如,find /etc -type f -perm /4000表示查找权限包含SUID位的文件。
  • -perm +mode:查找权限包含指定mode的所有位的文件。例如,find /etc -type f -perm +700表示查找权限包含用户可读写执行的文件。

使用案例

找出文件名位passwd的这个文件

find / -name passwd

找出文件名包含了passwd这个关键字的文件

find / -name "*passwd*"

找出系统中,大于1MB的文件

find / -size +1M

找出/run目录下,文件类型位socket的文件名有哪些?

find /run -type s

# type类型主要有:一般正规文件(f),设备文件(b,c),目(d),链接文件(l),socket(s),及FIFO(p)等属性

查找权限为rw-r–r–的所有文件:

find /usr/bin -type f -perm 644

查找权限包含其他用户可读写的文件:

find /usr/bin -type f -perm -022

查找权限包含SUID位的文件:

find /usr/bin -type f -perm /4000

查找权限包含用户可读写执行的文件:

find /etc -type f -perm +700

注意,权限参数中的mode是一个3位八进制数,其中每一位表示不同的权限,分别是读(r)、写(w)和执行(x),取值为0或1,其中0表示无该权限,1表示有该权限。例如,644表示rw-r–r–,755表示rwxr-xr-x。使用find命令的权限参数时,应该注意权限格式的正确性,以及权限的含义。

find命令与额外可进行操作的选项参数及使用案例

选项参数

-exec command {} \;:对查找到的每个文件执行指定的命令,其中command表示命令,任何{}表示查找到的文件名,;表示命令结束,【;】在bash环境下是有特殊意义的,因此利用反斜杠来转义

-print:将查找到的文件名输出到标准输出(通常是终端)。这是find命令默认的操作,如果不指定其他操作,则会输出所有查找到的文件名。

使用案例

找目录/etc下所有扩展名为.txt的文件,并删除它们

find /etc -type f -name "*.txt" -exec rm -rf {} \;

查找目录/etc下所有扩展名为.txt的文件,并将它们的文件名输出到标准输出

find /etc -type f -name "*.txt" -print

总结

1. find命令:
优点:可以通过多种条件(如文件名、大小、修改时间等)进行高级文件查找,灵活性较高。
缺点:查找速度较慢,因为需要递归遍历目录。
2. whereis命令:
优点:查找速度非常快,因为只搜索特定的系统目录(/usr/bin、/usr/sbin等)。
缺点:只能查找二进制文件和对应的man手册,不能查找其他类型的文件,且结果有限制。
3. which命令:
优点:查找速度快,结果直观,可以显示找到的第一个可执行文件的路径。
缺点:只能查找在系统路径中($PATH环境变量指定的目录)的可执行文件,而且无法查找其他类型的文件。
4. locate命令:
优点:查找速度快,因为使用了预先建立的索引数据库,在大型系统中查找非常有效。
缺点:由于使用了预先建立的索引数据库,所以需要更新索引,否则可能无法找到最新创建的文件,且无法查找未被索引的目录。
5. type命令:
优点:查找速度快,可以查找可执行文件、命令别名、shell内置命令、函数等。
缺点:只能查找系统已知的命令和函数,不能查找其他类型的文件,且不能查找自定义的命令别名。

如果需要高级文件查找,可以使用find命令;如果需要快速查找系统命令,可以使用whereis、which或type命令;如果需要在大型系统中查找文件,可以使用locate命令

本文参考《鸟哥的Linux私房菜》这本书

你可能感兴趣的:(Linux学习,linux,运维)