大家都知道文件查找的用处是很大的,因为我们经常因为各种原因要找某个文件,但是却又不知道它放在哪里!如果没有文件查找这个功能就太让人头疼了。下面让我们来看看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目录下最近一周内内容修改过且不属于root及student用户的文件;
# 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熟练掌握,因为它那强大的功能你随时都有可能用得到…