您所在的位置:读书频道 > 操作系统 > Linux > 7.5 搜索文件

7.5 搜索文件

2007-09-27 14:05 鸟哥 人民邮电出版社 字号:T | T
一键收藏,随时查看,分享好友!

《鸟哥的Linux私房菜》一书全面而详细地介绍了Linux操作系统,第七章介绍的是Linux文件和目录管理,本节是如何搜索文件。

AD:

7.5  搜索文件
搜索文件用处很大。因为我们常常需要知道某个文件放在哪里。在Linux中,也有相当优秀的搜索系统。通常find不很常用。因为速度慢,耗费硬盘空间。通常我们都是先使用whereis或者是locate来检查,如果真的找不到了,才以find来搜索。为什么呢?因为whereis与locate是利用数据库来搜索数据,所以相当快,而且并没有实际搜索硬盘,比较省时。
which(寻找“执行文件”)

[root@linux ~]# which [-a] command
参数:
-a : 将所有可找到的命令均列出,而不仅仅列出第一个找到的命令名称
范例:
[root@linux ~]# which passwd
/usr/bin/passwd
[root@linux ~]# which traceroute -a
/usr/sbin/traceroute
/bin/traceroute

这个命令是根据“PATH”环境变量所规范的路径,去搜索“执行文件”的文件名。所以,重点是找出“执行文件”。which后面接的是“完整文件名”。若加上 -a参数,则可以列出所有可以找到的同名执行文件,而非仅显示第一个。
whereis(寻找特定文件)
[root@linux ~]# whereis [-bmsu] 文件或目录名
参数:
-b  : 只找二进制文件
-m  : 只找在帮助文件manual路径下的文件
-s  : 只找来源文件
-u  : 没有帮助文件的文件。
范例:
[root@linux ~]# whereis passwd
passwd: /usr/bin/passwd /etc/passwd /etc/passwd.OLD
/usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
# 任何与passwd有关的文件名都会被列出来。

[root@linux ~]# whereis -b passwd
passwd: /usr/bin/passwd /etc/passwd /etc/passwd.OLD

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


稍候会提到find搜索命令,find是很强大的搜索命令,但很费时间(因为find是直接搜索硬盘,如果硬盘比较老旧的话,需要等很久)。这个时候,whereis就相当好用了。另外,whereis可以加入参数来找相关的数据。例如,如果要找可执行文件(binary),那么加上 -b就可以。如上面的范例针对passwd程序来说明。如果不加任何参数,那么就将所有的数据列出来。
whereis到底是使用什么呢?为何搜索速度会比find快这么多?其实也没有什么。这是因为Linux系统会将系统内的所有文件都记录在一个数据库文件里,当使用whereis或者locate时,都会以此数据库文件的内容为准,因此,有时你还会发现,使用这两个执行文件时,会找到已删除的文件。而且也找不到刚刚建立的最新文件。这就是因为这两个命令是通过数据库中的结果去搜索文件。
另外,基本上,Linux每天会针对Linux主机上所有文件的位置,进行搜索数据库的更新,更新的程序就是updatedb,可以在FC4系统的 /etc/cron.daily/slocate.cron文件找到相关的机制。当然,也可以直接使用 /usr/bin/updatedb来更新数据库文件。
locate
[root@linux ~]# locate filename
[root@linux ~]# locate passwd
/lib/security/pam_passwdqc.so
/lib/security/pam_unix_passwd.so
/usr/lib/kde3/kded_kpasswdserver.so
/usr/lib/kde3/kded_kpasswdserver.la
.......中间省略.......

locate的使用更简单,直接在后面输入“文件的部分名称”后,就能够得到结果。举例来说,输入locate passwd,那么,在完整文件名(包含路径名称)中,只要有passwd在其中,就会显示出来。如果忘记某个文件的完整文件名时,这也是个很方便好用的命令。
但是,它有使用的限制。为什么呢?你会发现,使用locate来寻找数据的时候特别快,这是因为locate寻找的数据是由“已建立的数据库 /var/ lib/slocate/”里面的数据所搜索到的,所以不用直接在去硬盘中存取数据,当然很快。那么,有什么限制呢?就是因为它是经由数据库来搜索的,而数据库的建立默认每天执行一次(每个版本都不同,FC4是每天更新数据库一次)。所以,如果新建立起文件,却还在数据库更新之前搜索该文件,locate会告诉你“找不到”。因为必须要更新数据库。
那么,到底要建立哪些数据库呢?是否全部都要建立?似乎不需要,这个时候,你可以自己选择需要建立文件数据库的目录。可以在 /etc/updatedb.conf文件内设置。建议使用默认值,不过,在 /etc/updatedb.conf里,请把“DAILY_UPDATE=no”改成“DAILY_UPDATE=yes”。至于修改的方法,等到我们第三篇介绍vi后,就会知道。当然,也可以手动执行updatedb。
find
[root@linux ~]# find [PATH] [option] [action]
参数:
1. 与时间有关的参数:
-atime n    : n为数字,意义为在n天之前的“一天之内”存取(access)过的文件。
-ctime n    : n为数字,意义为在n天之前的“一天之内”修改(change)过状态的文件。
-mtime n    : n为数字,意义为在n天之前的“一天之内”修改(modification)过的文件。
-newer file : file为一个存在的文件,意思是说,只要文件比file还要新,
就会被列出来。
2. 与用户或用户组名称有关的参数:
-uid n      : n为数字,这个数字是用户的账号ID,即UID,这个UID是记录在
/etc/passwd里与账号名称对应的数字。这方面会在第四篇介绍。
-gid n      : n为数字,这个数字是用户组名称的ID,即GID,这个GID记录在
/etc/group,相关的介绍会在第四篇说明。
-user name  : name为用户账号名称。例如dmtsai
-group name : name为用户组名称,例如users。
-nouser     : 寻找文件的拥有者不存在 /etc/passwd的人。
-nogroup    : 寻找文件的拥有用户组不存在于 /etc/group的文件。
自行安装软件时,很可能该软件的属性中并没有文件拥有者,
这是可能的。在这个时候,就可以使用 -nouser与 -nogroup搜索。
3. 与文件权限及名称有关的参数:
-name filename : 搜索文件名为filename的文件。
-size [+-]SIZE : 搜索比SIZE还要大(+)或小(-)的文件。这个SIZE的规格有:
c: 表示byte,k: 表示1024bytes。所以,要找比50KB
还要大的文件,就是“-size +50k”
-type TYPE     : 搜索文件的类型为TYPE,类型主要有:一般正规文件 (f),
设备文件 (b, c), 目录 (d), 连接文件 (l), 套接字(s),
及FIFO (p) 等属性。
-perm mode     : 搜索文件属性“刚好等于”mode的文件,这个mode为类似chmod
的属性值,举例来说,-rwsr-xr-x的属性为4755。
-perm -mode    : 搜索文件属性“必须要全部囊括mode的属性”的文件,举例来说,
要搜索 -rwxr--r--,即0744的文件,使用 -perm -0744,
当一个文件的属性为 -rwxr-xr-x,即4755时,也会列出来,
因为 -rwxr-xr-x 的属性已经囊括了 -rwxr--r-- 的属性了。
-perm +mode    : 搜索文件属性“包含任一 mode的属性”的文件,举例来说,我们搜索
-rwxr-xr-x,即 -perm +755时,但一个文件属性为 -rw-------
也会被列出来,因为它有 -rw.... 的属性存在。
4. 额外可进行的动作:
-exec command  : command为其他命令,-exec后面可再接额外的命令来处理搜索到
的结果。
-print         : 将结果打印到屏幕上,这个动作是默认动作。
范例:
范例一:将过去系统上24小时内更改过内容(mtime)的文件列出
[root@linux ~]# find / -mtime 0
# 0是重点。0表示当前时间,所以,从现在开始到24小时前,
# 修改过内容的文件都会列出来。如果是三天前的24小时内呢?
# find / -mtime 3,意思是说今天之前的3*24 ~ 4*24小时之间
# 修改过的文件都列出。同时 -atime与 -ctime的用法相同。

范例二:寻找 /etc下面的文件,如果文件日期比 /etc/passwd新就列出。
[root@linux ~]# find /etc -newer /etc/passwd
# -newer 用在分辨两个文件之间的新旧关系。

范例三:搜索 /home下面属于dmtsai的文件
[root@linux ~]# find /home -user dmtsai
# 这也很有用。当我们要找出任何一个用户在系统中的所有文件时,
# 就可以利用这个命令将属于某个用户的所有文件都找出来。

范例四:搜索系统中不属于任何人的文件。
[root@linux ~]# find / -nouser
# 通过这个命令,可以轻松找出不太正常的文件。
# 如果找到不属于系统任何人的文件时,不要太紧张,
# 有时候是正常的。尤其是你曾经以源码自行编译软件时。

范例五:找出文件名为passwd的文件。
[root@linux ~]# find / -name passwd
# 利用 -name可以搜索文件名。

范例6:搜索文件属性为 f(普通文件)的文件。
[root@linux ~]# find /home -type f
# -type的属性也很有帮助。尤其是要找出那些怪异的文件,
# 例如套接字与FIFO文件,可以用find /var -type p或 -type s来找。

范例7:搜索文件中含有SGID/SUID/SBIT的属性。
[root@linux ~]# find / -perm +7000
# 7000就是 ---s--s--t,只要含有s或t的就列出,
# 所以当然要使用 +7000,使用 -7000表示要含有 ---s--s--t的所有3个权限,
# 因此,就是 +7000。

范例八:将上个范例找到的文件使用ls -l列出来。
[root@linux ~]# find / -perm +7000 -exec ls -l {} \;
# 注意,-exec后面的ls -l就是额外的命令,
# {} 表示“由find找到的内容”。所以,-exec ls -l {}
# 就是将前面找到的文件以ls -l列出详细信息。至于 \; 则是表示
# -exec的命令到此为止。意思是说,整个命令其实只有在
# -exec(里面就是执行命令)\;
# 也就是说,-exec最后一定要以 \; 结束才行。

范例九:找出系统中大于1MB的文件。
[root@linux ~]# find / -size +1000k
# 虽然在man page提到可以使用M与G分别表示MB与GB,
# 不过,笔者却试不出来这个功能。所以,当前应该是仅支持到c与k。


如果要寻找一个文件,使用find是不错的主意。它可以根据不同的参数提供搜索功能。例如,要寻找文件名为httpd.conf的文件,它应该是在 /etc中,就可以使用“find /etc -name httpd.conf”。如果记得有一个文件的文件名包含了httpd,但不知道全名,可以用通配符 * ,如“find /etc -name '*httpd*'”,就可将文件名含有httpd的文件都列出来。不过,由于find在寻找数据时相当消耗硬盘。所以一般不要使用find。有更好的命令可以取代它,那就是whereis与locate。
不管怎么说,find在找寻特殊的文件属性以及特殊的文件权限(SUID/SGID等等)时,是相当有用的工具程序之一。这很重要。

【责任编辑:雪花 TEL:(010)68476606】

回书目   上一节   下一节

分享到:

  1. Linux服务器配置全程实录
  2. 揭秘--优秀PPT这样制作

热点职位

更多>>

热点专题

更多>>

读书

C语言核心技术
在这本书中,C 语言专家 Peter Prinz和Tony Crawford为你提供大量的编程参考信息。全书叙述清晰,语句简洁,分析深刻。本书主题

最新热帖

更多>>

51CTO旗下网站

领先的IT技术网站 51CTO 中国首个CIO网站 CIOage 中国首家数字医疗网站 HC3i 51CTO学院 区块链第一聚合媒体 zhijiapro