在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命令很重要