美文网首页
如何在Linux系统中使用命令find、which、wherei

如何在Linux系统中使用命令find、which、wherei

作者: 公子小白123 | 来源:发表于2021-01-19 08:51 被阅读0次

    在Linux下通常我们需要修改或维护一些文件,但是不知道它到底在哪,这时候就要求我们知道如何在Linux下进行文件查找的操作了。这里总结四种查找命令:which、whereis、locate、find。但是find不是很常用,因为查找的速度慢,而whereis和locate是我们常用的,它们是利用数据库来查找数据的,所以相当快速,而且没有实际查询硬盘,比较节省时间,下面分别介绍这四种命令的使用方法.

    which(寻找执行文件)

    which是根据用户设置的PATH变量内的目录去查找可执行文件的,所以不同的PATH设置的内容所找到的命令也不一样,当我们用root用户和普通用户来查找同一个命令时,得到的结果也会不一样了。

    root用户:

    # which ls

    alias ls='ls --color=auto'

        /usr/bin/ls

    1

    2

    3

    使用su - sadmin切换到普通用户sadmin

    $ which ls

    alias ls='ls --color=auto'

        /bin/ls

    1

    2

    3

    可以使用快捷键CTRL+D退出,或者输入命令exit。

    whereis(寻找特定文件)

    Linux系统会将系统内所有的文件都记录到一个数据库文件里面,当使用whereis或者locate时,都会以此数据库文件的内容作为标准,因此,有时我们会查找到已经被删除的文件,而且还找不到新建立的文件。

    whereis可以加入参数查找相关的数据

    用法:

        whereis [options] file

    Options:

    -b        只搜索二进制文件(可执行文件)

    -B <目录>  定义二进制文件查找路径

    -m        只搜索在说明文件manual路径下的文件

    -M <目录>  定义 man 手册查找路径

    -s        只搜索源代码

    -S <目录>  定义源代码查找路径

    -f        终止 <目录> 参数列表

    -u        搜索不常见记录(不在-b -m -s选项中)

    -l        输出有效查找路径

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    查找passwd这个文件名有关的所有数据

    # whereis passwd

    passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz

    1

    2

    只查找跟passwd有关的“说明文件”文件名

    # whereis -m passwd

    passwd: /usr/share/man/man1/passwd.1.gz

    1

    2

    locate

    locate命令比较简单,直接在后面输入”文件的部分名称”后就可以得到结果,如果我们忘记了某个文件的完整文件名时可以使用这个文件来查找

    如果输入该命令提示-bash: locate: command not found,那么需要我们先进行安装:

    # yum -y install mlocate

    1

    安装好了之后不能马上进行数据查询,得先将数据库初始化

    # updatedb

    1

    初始化完成就可以使用locate进行文件查找了

    # locate passwd

    /etc/passwd

    /etc/passwd-

    /etc/pam.d/passwd

    /etc/security/opasswd

    /usr/bin/gpasswd

    /usr/bin/grub2-mkpasswd-pbkdf2

    /usr/bin/htpasswd

    /usr/bin/lppasswd

    /usr/bin/passwd

    /usr/include/rpcsvc/yppasswd.h

    /usr/include/rpcsvc/yppasswd.x

    /usr/lib/firewalld/services/kpasswd.xml

    /usr/lib64/security/pam_unix_passwd.so

    /usr/local/aegis/PythonLoader/lib/python2.7/test/keycert.passwd.pem

    /usr/local/aegis/PythonLoader/lib/python2.7/test/ssl_key.passwd.pem

    ......

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    所有包含passwd的文件名都被列出来了

    用法:

        # locate [-ir] keyword

    参数:

        -i 忽略大小写的差异

        -r 后面可接正则表达式的显示方式

    1

    2

    3

    4

    5

    但是使用locate寻找的数据是从已经创建的数据库/var/lib/mlocate/里面的数据查找的,所以不会直接从硬盘当中访问数据,当然就快速,但是数据库的创建默认是每天执行一次(每个distribution都不同),所以我们新建的文件没有被数据库收录,当然就找不到了,这时我们可以使用updatedb命令进行手动更新。

    updatedb命令会去读取/etc/updatedb.conf这个配置文件的设置,然后再去硬盘里进行查找文件名的操作,最后更新整个数据库文件/var/lib/mlocate,因为要在硬盘上进行文件查找,所以可能会等一会儿或者几分钟的时间。

    locate:依据/var/lib/mlocate内的数据库记载,找出用户输入的关键字文件名

    find

    find是很强大的查找命令,但是花费的时间多,每一次查询都要直接去硬盘进行查找。

    1.与时间有关的参数

    -mtime n: n 为数字,意思是几天之前的"一天之内"被更改过的文件

    -mtime +n: 列出n天之前(不包含n本身)被更改过的文件名

    -mtime -n: 列出n天之内(包含n本身)被更改过的文件名

    -nerer file: file为存在的一个文件,列出比file还要新的文件名

    1

    2

    3

    4

    5

    6

    7

    将系统中24小时内被改过的文件列出

    # find / -mtime 0

    /后面没有接具体的目录,代表把系统中所有有关的都列出来,0代表的是现在开始的24小时前,如果是列出2天前的24小时之内被改动过的文件的话,# find / -mtime 2

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

    # find /etc -newer /etc/passwd

    1

    -newer用来区别两个文件的新旧关系

    2.与用户或用户组有关的参数

    -uid n:n 为数字,就是用户的UID,记录在/etc/passwd文件中与用户名对应的数字

    -gid n: n 为数字,就是用户组的UID,记录在/etc/group文件中与用户组名对应的数字

    -user name: name 是用户账号的名称

    -group name: name 是用户组的名称

    -nouser: 寻找文件的所有者不在/etc/passwd的文件

    -nogroup: 寻找文件的用户组不在/etc/group的文件

    1

    2

    3

    4

    5

    6

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

    # find /home user sadmin

    /home

    /home/sadmin

    /home/sadmin/.bash_logout

    /home/sadmin/.ssh

    /home/sadmin/.ssh/known_hosts

    /home/sadmin/.bashrc

    /home/sadmin/.bash_profile

    /home/sadmin/.bash_history

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

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

    # find / -nouser

    1

    通过这个命令可以轻易找出不太正常的文件,如果有不属于系统任何人的人间时不用紧张,有时候这些文件是正常的,使用-nouser或-nogroup时,除了在网上下载的文件,还有可能你将某个账号删除了,但是这个账号已经在系统内建立了很多文件,这时就会发现很多无主孤魂的文件。

    3.与文件权限有关的参数

    -name filename:查找文件名为filename的文件

    -size [+-]SIZE:查找比SIZE还要大(+)或小(-)的文件,SIZE的规格:

                c:代表byte k:代表1024byte,查找比50kb还大的文件就是"-size +50k"

    -type TYPE: 查找文件类型为TYPE的文件,类型一般有:

                一般正规文件(f)、设备文件(b、c)、目录(d)、socket(s)等

    -perm mode: 查找文件权限正好是mode的文件,这个mode为类似chomd的属性值,下同

    -perm -mode:查找文件权限“必须全部包含mode的权限”的文件,当我们要查找一个权限为"-rwxr--r--",

                即0744的文件,使用-perm -0744 ,当一个文件为"-rwsr-xr-x",即0755时也会被列出来,因为"-rwsr-xr-x"的属性已经包含了"-rwxr--r--"的属性

    -perm +mode:查找文件权限“包含任一mode的权限”的文件

    1

    2

    3

    4

    5

    6

    7

    8

    9

    查找文件名为passwd的文件

    # find / -name passwd

    /usr/bin/passwd

    /etc/passwd

    /etc/pam.d/passwd

    ......

    1

    2

    3

    4

    5

    6

    查找/var目录下类型为Socket的文件

    # find /var -type s

    /var/spool/postfix/public/pickup

    /var/spool/postfix/public/showq

    /var/spool/postfix/public/cleanup

    /var/spool/postfix/public/flush

    /var/spool/postfix/public/qmgr

    /var/spool/postfix/private/scache

    /var/spool/postfix/private/tlsmgr

    /var/spool/postfix/private/verify

    /var/spool/postfix/private/proxymap

    /var/spool/postfix/private/smtp

    /var/spool/postfix/private/retry

    ......

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    查找/bin,/sbin目录下具有SUID或SGID的文件

    # find /bin /sbin -perm +6000

    1

    因为SUID是4分,SGID是2分,总共6分,因此可以用+6000来处理这个权限,还可以多个目录查找,用空格隔开

    4.其他可进行的操作

    -exec commad:command为其他命令,-exec后面可以再接其他命令来处理查到的结果

    -print :将结果打印到屏幕,这个是默认的操作

    1

    2

    将“查找/bin,/sbin目录下具有SUID或SGID的文件”找到的文件用ls -l列出来:

    # find /var -type s -exec ls -l {} \;

    srw-rw-rw- 1 postfix postfix 0 Aug 18  2017 /var/spool/postfix/public/pickup

    srw-rw-rw- 1 postfix postfix 0 Aug 18  2017 /var/spool/postfix/public/showq

    srw-rw-rw- 1 postfix postfix 0 Aug 18  2017 /var/spool/postfix/public/cleanup

    srw-rw-rw- 1 postfix postfix 0 Aug 18  2017 /var/spool/postfix/public/flush

    srw-rw-rw- 1 postfix postfix 0 Aug 18  2017 /var/spool/postfix/public/qmgr

    srw-rw-rw- 1 postfix postfix 0 Aug 18  2017 /var/spool/postfix/private/scache

    srw-rw-rw- 1 postfix postfix 0 Aug 18  2017 /var/spool/postfix/private/tlsmgr

    srw-rw-rw- 1 postfix postfix 0 Aug 18  2017 /var/spool/postfix/private/verify

    srw-rw-rw- 1 postfix postfix 0 Aug 18  2017 /var/spool/postfix/private/proxymap

    srw-rw-rw- 1 postfix postfix 0 Aug 18  2017 /var/spool/postfix/private/smtp

    srw-rw-rw- 1 postfix postfix 0 Aug 18  2017 /var/spool/postfix/private/retry

    srw-rw-rw- 1 postfix postfix 0 Aug 18  2017 /var/spool/postfix/private/bounce

    ......

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    -exec后面的ls -l 就是额外的命令,命令不支持别名,所以只能写成ls -l,不能写成ll

    find的特殊功能额外命令的图解:

    在这条命令中,有{}以及\;,还有-exec关键词

    {}代表的是由find找到的内容,上图所示,find找到的结果会被放到{}位置中

    -exec一直到\;是关键字,代表find额外命令的开始(-exec)到结束(\;),在这中间就是find命令内的额外命令,图中的额外命令是ls -l {}。

    因为;在bash环境下是有特殊意义的,所以用反斜杠来转义。

    find可以使用通配符

    如果我们需要找具有特殊属性的文件,利用locate没法找到的,这个时候find就很重要了

    find命令还可以使用通配符来查找文件名,如果我们想找到/etc文件名下包含http的文件,我们可以写成下面的格式:

    # find /etc -name '*http*'

    1

    find不但可以指定查找的目录(连同子目录),还可以利用额外的参数来找到最正确的文件名,所以find命令很重要

    相关文章

      网友评论

          本文标题:如何在Linux系统中使用命令find、which、wherei

          本文链接:https://www.haomeiwen.com/subject/uufxzktx.html