如何在Linux系统中使用命令find、which、whereis、locate查找文件

在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、whereis、locate查找文件)