大家都知道文件查找的用处是很大的,因为我们经常因为各种原因要找某个文件,但是却又不知道它放在哪里!如果没有文件查找这个功能就太让人头疼了。下面让我们来看看linux下是怎样进行文件查找的。

Linux下也有不错的搜索系统,我们就不一一列出了,下面我们先来看一下‘locate’。locate的用法很简单,而且速度很快,不过它执行的却不是精确查找,而且是非实时的。locate的查找是根据系统文件数据库进行的,说到这里我们来提一下文件数据库。

Linux系统会将系统内所有的文件都记录在一个数据库文件里,而这个数据库文件默认是每天执行一次,如果你今天建立的文件或删除的文件,用locate命令来查看的话是不会显示出来的,这也就是它为什么是非实时的了,locate的速度之所以非常快就是因为它在执行时不需要读取硬盘,直接从文件数据库查找数据。locate的用法也很简单,只需要在后面加上文件名即可,但是它查找到的并不只是一个或者一类,比如:

你用 locate passwd 来查找的时候,他会将系统上所有包含了‘passwd’的文件路径都显示出来。(注:不包含当天创建的)

你会发现从这些文件中找出你要的那个文件依然不简单。所以我们通常用的find命令来查找,相比于locate来说find命令更能精确的查找,而且是实时查找,支持众多的查找标准,不过唯一的不足就是find命令式遍历指定目录中的所有文件完成查找的,速度比较慢!find是一个很强大的命令,也是我们今天的主角,下面我们来具体的了解一下find命令。

格式:find 查找路径 查找标准 查找到以后的处理动作

查找路径:默认为当前目录

查找标准:默认为指定路径下的所有文件

处理动作:默认为显示

我们先来介绍一下find命令定义查找标准的相关选项

-name :后面跟文件名,可以对文件名做精确匹配,即根据文件名查找(严格区分大小写)。支持文件名通配符,如果既不清楚文件的名字可以利用文件名通配符来进行模糊查找。如:

范例1:找到/etc下的文件名中包含sh的文件

# find /etc -name *sh*

-iname :不区分文件名的大小写,文件名中的任意字母的大写小写都不考虑,只要包含就显示出来

-regex PATTERN:基于正则表达式进行文件名匹配

-user USERNAME基于文件属主来查找

-group GROUPNAME:根据文件属组查找

-uid UID:根据uid查找

-gid GID:根据gid查找

-nouser :查找没有属主的文件

-nogroup :查找没有属组的文件

-type :根据文件类型来查找

  f:普通文件

  d:目录文件

  c:字符设备文件(character

  b:块设备文件(block

  l:符号链接文件(symbolic link file

  p:命令管道文件(pipe

  s:套接字文件(socket

比如:

范例2搜索文件属性为c(字符设备文件)的文件

# find /home -type c

-size:根据文件大小来查找

[+|-]#[k|M|G+#k代表大于#k的文件,-#k代表小于#k的文件,#k代表精确查找#k的文件(注:#代表数字)

范例3查找/etc目录下大于1M的文件,并将其文件名写入/tmp/etc.largefiles文件中;

# find /etc -size +1M >> /tmp/etc.largefiles

另外还可以把这些命令组合起来使用下面我们来看一下组合条件:

不指定时默认条件是‘与’

-a:与

-o:或

-not:非

如:

范例4:# find /tmp -not -type d查找tmp目录下不是目录的文件

范例5:# find /tmp -not -user user1 查找属主不是user1的文件

范例6:# find /tmp -not -user user1 -a -not -user user2  # find /tmp -not \(-user user -o -user user2\) 两个命令都是查找属主不是user1又不是user2的文件

范例7查找/var目录下属主为root并且属组为mail的所有文件;

# find /var -user root -group mail

范例8查找/usr目录下不属于root,bin,student的文件;

# find /usr -not -user root -a -not -user bin -a -not -user student

# find /usr -not \( -user root -o -user bin -o -user student \)

根据文件的时间属性来查找

-mtime -##代表数字(下同),表示的是在#天内被修改了的文件

-ctime -#:表示的是在#天内被改变了的文件

-atime -#:表示的是在#天内被访问了的文件

-mmin -#:表示的是在#分钟内被修改了的文件

-cmin -#:表示的是在#分钟内被改变了的文件

-amin -#:表示的是在#分钟内被访问了的文件

这里也支持[+|-]用法跟-size相同

范例9查找/etc目录下最近一周内内容修改过且不属于rootstudent用户的文件;

# find /etc -mtime -7 -not \ ( -user root -o -user student \)

# find /etc -mtime -7 -not -user root -a -not -user student

根据权限来查找

-perm mode:精确匹配,即每一位权限都与定义的权限要完全匹配

-perm -mode:(权限如755,644)表示文件权限能完全包含此MODE的才能显示

-perm \ mode: 表示任意一位权限匹配即满足条件

处理动作:

-print:显示

-ls:跟ls -l命令相似,显示每一个文件的详细信息

-ok COMMAND {} \;(分号不可少):每一次操作都需要用户确认

-exec COMMAND {} \; :不需要确认

范例10查找/etc目录下所有用户都没有写权限的文件,显示出其详细信息;

# find /etc -not -perm /222 -ls

范例11查找当前系统上没有属主或属组且最近1天内曾被访问过的文件,并将其属主属组均修改为root

# find / \( -nouser -o -nogroup \) -a -atime -1 -exec chown root:root {} \;

如果要查找文件的话find是个不错的选择,尽管find不是那么尽如人意,但它那强大的功能也能弥补了它的不足。当然了,如果你根本就不需要find提供的这些功能的话最好还是不要动用它,因为find是从硬盘读取数据的,这样就很消耗硬盘了,所以我还是建议如果不需要精确查找的话还是使用locate.但是我们也要对find熟练掌握,因为它那强大的功能你随时都有可能用得到…