讲到Linux的文件查找,首先大家一般在Windows中有过查找过文件,我们知道window是以文件名结尾来识别文件的,使用一些通配符*.doc,*.txt来检索一类文件,缩小范围,实现快速定位文件,在Linux中,也有文件查找的需要不过实现的方式将更加灵活;
1)locate工具
2)find工具
1.locate
Linux中也有像window中那样模糊匹配的查找方式,那就是locate工具下面来详细介绍locate;
(1)工作原理:
locate查找文件不是对当前文件系统遍历查找,而是在locate自己的数据库locateDB中查找,根据系统负载状况,只需要在某个特定的时间点来遍历整个文件系统,把所有遍历的文件名放到自己的数据库中,这样在使用locate工具查找时只需要检索自己的数据库文件,速度是非常快的,但是又会带来一下几个问题;
a:数据库更新时需要遍历整个系统,然后记录在locateDB中,遍历整个系统时,需要消耗大量的系统资源;所以系统一般只在特定的时间自动更新,也可以手动;
b:locate在自己的数据库文件中检索,不用在系统中检索,查找速度是非常快的;
c:系统中的文件操作是很频繁的,创建移动复制删除一个文件后,要想查找,对于这些最近更新的文件,是没办法准确定位的,因为locate工具检索的是自己的数据库文件,locateDB数据库文件只在特定的时间更新,所以很难实现实时查找;
d:locate工具查找文件时只能对文件名进行globe通配匹配条件,没办法根据文件的其它属性针对查找,也就是说很难实现文件的精确匹配查找;
(2)locate命令工具使用:
命令:locate
语法:
locate [option]…pattern…
-i:ignore-case
-d:locateDB directory
-r:regex
-n #:只显示前#个匹配查找到的文件;
-c:统计查找到的文件个数;
(2)locateDB数据库文件在系统中的位置:
/var/lib/mlocate/mlocate.db
[root@xia7 ~]# ll /var/lib/mlocate/mlocate.db -rw-r----- 1 root slocate 3223706 Aug 16 09:12 /var/lib/mlocate/mlocate.db [root@xia7 ~]#
(3).如何手动更新locatdb?
updatedb
[root@xia7 ~]# updatedb [root@xia7 ~]#
2.find
前面所说的locate工具虽然速度检索快,但是不能实现实时查找和特定文件属性查找,Linux系统中还有一款强
大的查找工具find,能够完成更多的高级查找条件,实现准确定位文件;
(1)find工作原理:
find工具可以指定特定路径和查找条件,对指定路径下所有路径根据查找条件完整遍历,查找完以后还能做相应的处理动作;工具功能非常强大;简述特性如下:
a:find是对指定路径下完整遍历,默认不指定是当前目录,因为查找的是系统路径,所以是实时查找;
b:由于查找的路径是系统完整路径,尤其是文件系统很大时,查找起来系统负载压力会很大,同时查找速度相对于locate的数据库文件查找有点慢;
c:find的查找条件很多可以基于正则表达式以及其他文件属性,权限,大小,时间戳,属主属组,文件类型作为匹配查找条件,这样就能对文件实现精确定位查找;
b:而且对查找到的文件还能多相应的处理动作,一般默认是print,还能多其他很多对文件操作的处理命令;这样对文件的处理能力得到进一步加强;
(2)find命令工具使用:
命令:find
语法:
find [option]…[查找路径] [查找条件] [处理动作]
常用选项:
-P:查找的文件如果是链接文件,将查找软链接文件指向的位置;
查找路径:
不写默认从当前路径向下查找
可以指定路径
查找条件:
a:根据文件名和inode查找:
-name filename :根据文件名查找;
-iname filename :查找文件名时忽略大小写;
-inum inode:根据inode号查找;
-regex "pattern" :根据模式匹配查找文件;
[root@xia7 ~]# find /etc -name passwd /etc/passwd /etc/pam.d/passwd [root@xia7 ~]# find /etc -iname SHADOW /etc/shadow [root@xia7 ~]# ll -i /etc/passwd 134347177 -rw-r--r-- 1 root root 2069 Aug 15 10:23 /etc/passwd [root@xia7 ~]# find / -inum 134347177 /etc/passwd [root@xia7 ~]# [root@xia7 ~]# find / -regex ".*passwd$" /usr/bin/lppasswd /usr/bin/passwd /usr/bin/gpasswd /usr/bin/smbpasswd /usr/bin/vncpasswd /usr/bin/kdepasswd /usr/sbin/lpasswd /usr/sbin/chpasswd
b:根据属主属组查找:
-user username:根据属主查找文件;
-group groupname:根据属组查找文件;
-uid userid:根据用户uid查找文件;
-gid usergid:根据用户gid查找文件;
-nouser:查找没有属主的文件;
-nogroup:查找没有属组的文件;
[root@xia7 ~]# find /home -user xia /home/xia /home/xia/.mozilla /home/xia/.mozilla/extensions /home/xia/.mozilla/plugins /home/xia/.bash_logout /home/xia/.bash_profile [root@xia7 ~]# [root@xia7 ~]# find /home -group xiashixiang /home/xiashixiang /home/xiashixiang/.mozilla /home/xiashixiang/.mozilla/extensions /home/xiashixiang/.mozilla/plugins [root@xia7 ~]# find /home/ -uid 1000 /home/mageedu /home/mageedu/.mozilla /home/mageedu/.mozilla/extensions /home/mageedu/.mozilla/plugins [root@xia7 ~]# userdel xiashixiang [root@xia7 ~]# find /home -nouser /home/xiashixiang /home/xiashixiang/.mozilla/plugins /home/xiashixiang/.bash_logout /home/xiashixiang/.bash_profile /home/xiashixiang/.bashrc [root@xia7 ~]# ll /home/xiashixiang/.bashrc -rw-r--r-- 1 1002 1002 231 Nov 20 2015 /home/xiashixiang/.bashrc [root@xia7 ~]#
c:根据文件类型查找:
-type f:查找文件类型为普通文件;
-type d:查找文件类型为目录文件;
-type l:查找文件类型为软连接文件;
-type b:查找文件类型为块设备文件;
-type c:查找文件类型为字符设备文件;
-type s:查找文件类型为套接字文件;
-type p:查找文件类型为管道文件;
[root@xia7 ~]# find /home -type d /home /home/mageedu /home/mageedu/.mozilla [root@xia7 ~]# find /run/ -type s /run/abrt/abrt.socket /run/NetworkManager/private /run/gssproxy.sock /run/systemd/notify [root@xia7 ~]# ll /run/systemd/notify srwxrwxrwx 1 root root 0 Aug 16 2016 /run/systemd/notify [root@xia7 ~]# [root@xia7 ~]# find / -type p /run/dmeventd-client /run/dmeventd-server [root@xia7 ~]# ll /run/dmeventd-client prw------- 1 root root 0 Aug 16 15:48 /run/dmeventd-client [root@xia7 ~]#
d:根据文件大小查找文件:
-size [+|-]#[k|M|G]
-size 5k :表示查找文件大小4k-5k之间的所有文件;
-size -5k :表示查找文件大小为4k以下的文件;
-size +5k :表示查找文件大小为5k以上的所有文件;
[root@xia7 dir]# ll -h /dir/ total 28M -rw-r--r-- 2 root root 15 Aug 16 15:57 ceshi -rw-r--r-- 2 root root 15 Aug 16 15:57 ceshi_hlink -rw-r--r-- 1 root root 2.0M Aug 16 16:20 file2 -rw-r--r-- 1 root root 3.0M Aug 16 16:21 file3 -rw-r--r-- 1 root root 4.0M Aug 16 16:21 file4 -rw-r--r-- 1 root root 5.0M Aug 16 16:21 file5 -rw-r--r-- 1 root root 6.0M Aug 16 16:21 file6 -rw-r--r-- 1 root root 7.0M Aug 16 16:22 file7 [root@xia7 dir]# find /dir/ -size 4M /dir/file4 [root@xia7 dir]# find /dir/ -size +4M /dir/file5 /dir/file6 /dir/file7 [root@xia7 dir]# find /dir/ -size -4M /dir/ /dir/ceshi /dir/ceshi_hlink /dir/file2 /dir/file3 [root@xia7 dir]#
e:根据文件的时间戳查找文件:
-atime -mtime -ctiem :以天为单位24小时;
-amin -mmin -cmin :表示以分钟为单位;
-atime [+|-]#
-atime 5 :表示查找的文件访问时间为5-6天之内的文件;
-atime +5 :表示查找的文件访问时间为6天以上的文件;
-atime -5 :表示查找的文件访问时间为5天以内的文件;
其他时间表示的区间用法一样;
[root@xia7 dir]# find / -atime 3 find: ‘/proc/1558/task/1558/fd/6’: No such file or directory find: ‘/proc/1558/task/1558/fdinfo/6’: No such file or directory find: ‘/proc/1558/fd/6’: No such file or directory find: ‘/proc/1558/fdinfo/6’: No such file or directory /usr/bin/kill /usr/share/man/man1/sort.1.gz /usr/share/man/man1p/sort.1p.gz /usr/share/man/man3/sort.3pm.gz /etc/systemd/journald.conf /var/log/messages-20160813 /var/log/cron-20160814 /var/log/maillog-20160814 /var/log/secure-20160814 /var/log/spooler-20160814 /var/spool/abrt/ccpp-2016-08-03-05:17:40-3996/not-reportable [root@xia7 dir]# stat /usr/bin/kill File: ‘/usr/bin/kill’ Size: 29264 Blocks: 64 IO Block: 4096 regular file Device: 803h/2051d Inode: 588838 Links: 1 Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2016-08-13 11:34:01.328118074 +0800 Modify: 2015-11-20 20:37:48.000000000 +0800 Change: 2016-07-28 01:45:05.517002449 +0800 Birth: - [root@xia7 dir]# date Tue Aug 16 16:30:15 CST 2016 [root@xia7 dir]# [root@xia7 dir]# find /etc/init.d/ -atime -3 /etc/init.d/ /etc/init.d/functions /etc/init.d/network [root@xia7 dir]# stat /etc/init.d/network File: ‘/etc/init.d/network’ Size: 6630 Blocks: 16 IO Block: 4096 regular file Device: 802h/2050d Inode: 7807 Links: 1 Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2016-08-15 19:25:33.748523241 +0800 Modify: 2015-09-16 19:51:07.000000000 +0800 Change: 2016-07-28 01:45:13.605002630 +0800 Birth: - [root@xia7 dir]# date Tue Aug 16 16:33:17 CST 2016 [root@xia7 dir]# [root@xia7 dir]# find /etc/init.d/ -atime +7 /etc/init.d/README /etc/init.d/netconsole [root@xia7 dir]# stat /etc/init.d/netconsole File: ‘/etc/init.d/netconsole’ Size: 2989 Blocks: 8 IO Block: 4096 regular file Device: 802h/2050d Inode: 7806 Links: 1 Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2016-08-03 02:56:47.264675229 +0800 Modify: 2015-09-16 19:51:07.000000000 +0800 Change: 2016-07-28 01:45:13.605002630 +0800 Birth: - [root@xia7 dir]# date Tue Aug 16 16:35:11 CST 2016 [root@xia7 dir]#
f:根据权限查找文件:
-perm[/|-] mode
-perm 644 :查找权限为644的文件,精确查找;
-perm -444 :查找每组权限只要有读权限的文件;
-perm /222 :查找每组权限只要有一组权限是写权限的文件;
-perm -020 :表示查找属组有写权限的文件,0表示忽略权限位;
[root@xia7 dir]# find /home -perm 644 /home/mageedu/.bash_logout /home/mageedu/.bash_profile /home/mageedu/.bashrc /home/xia/.bash_logout /home/xia/.bash_profile /home/xia/.bashrc /home/xiashixiang/.bash_logout /home/xiashixiang/.bash_profile /home/xiashixiang/.bashrc [root@xia7 dir]# ll /home/xiashixiang/.bashrc -rw-r--r-- 1 1002 1002 231 Nov 20 2015 /home/xiashixiang/.bashrc [root@xia7 dir]# [root@xia7 dir]# find /tmp -perm -222 /tmp /tmp/.X11-unix /tmp/.font-unix /tmp/.ICE-unix /tmp/.Test-unix /tmp/.XIM-unix /tmp/systemd-private-6ca5fb894d61414da9daecbef334b022-cups.service-q0ZQQD/tmp [root@xia7 dir]# ll /tmp/.font-unix -d drwxrwxrwt. 2 root root 6 Jul 28 01:45 /tmp/.font-unix [root@xia7 dir]# [root@xia7 dir]# ll total 27656 -rw-r--r-- 2 root root 15 Aug 16 15:57 ceshi -rw-r--r-- 2 root root 15 Aug 16 15:57 ceshi_hlink -rw-r--r-- 1 root root 2097152 Aug 16 16:20 file2 -r-xrwxr-x 1 xia xia 3145728 Aug 16 16:21 file3 -rw-r--r-- 1 root root 4194304 Aug 16 16:21 file4 -rw-r--r-- 1 root root 5242880 Aug 16 16:21 file5 -rw-r--r-- 1 root root 6291456 Aug 16 16:21 file6 -rw-r--r-- 1 root root 7340032 Aug 16 16:22 file7 [root@xia7 dir]# su - xia Last login: Tue Aug 16 16:55:09 CST 2016 on pts/0 [xia@xia7 ~]$ find /dir -perm /111 /dir /dir/file3 [xia@xia7 ~]$
g:组合查找条件:
与:-a :并且的关系,条件之间可以省略;
或:-o :条件之间是或者的关系;
非:-not,!:对条件取反;
根据多个相同条件之间可以使用德.摩根定律,这样对后面的动作处理对象有个明确的范围;
非( A -a B ) = (非A) -o (非B)
非( A -o B ) = (非A) -a (非B)
root@xia7 dir]# find /home/ -type d -a -nouser /home/xiashixiang /home/xiashixiang/.mozilla /home/xiashixiang/.mozilla/extensions /home/xiashixiang/.mozilla/plugins [root@xia7 dir]# ll /home/xiashixiang/ -d drwx------ 3 1002 1002 74 Aug 15 10:23 /home/xiashixiang/ [root@xia7 dir]#
h:处理动作:
-print:这是默认的处理动作。显示到stdout;
-ls :相当于于执行ls -l 命令查看匹配到的文件详细信息;
-delete:对查找的文件删除,注意:动作很危险,在工作中谨慎使用,避免误操作;
-fls file:对查找的文件ls -l的详细输出保存到指定文件中;
-ok COMMAND {} \;对查找到的文件,每个文件都执行CMMMAND命令,后面的{}花括号表示引用查找
到的文件自身;“\;“表示特定固定格式;-ok,表示对每条执行都进行确认问答,直接
回车表示忽略;
-exce COMMAND {} \; -exce:表示忽略全部执行前的确认,直接执行命令;
find | xargs COMMAND – :命令一般对参数会有限制,这时超过限制参数量,命令会报错,为了避免报错,
可以使用xargs命令,把查找到的结果,全部通过管道传递给xargs命令,在做相应的操作命令;
[root@xia7 dir]# find /home/ -type d -a -nouser -ls 28066 0 drwx------ 3 1002 1002 74 Aug 15 10:23 /home/xiashixiang 67380614 0 drwxr-xr-x 4 1002 1002 37 Jul 28 01:43 /home/xiashixiang/.mozilla 134369665 0 drwxr-xr-x 2 1002 1002 6 Jun 10 2014 /home/xiashixiang/.mozilla/extensions 201368685 0 drwxr-xr-x 2 1002 1002 6 Jun 10 2014 /home/xiashixiang/.mozilla/plugins [root@xia7 dir]#
原创文章,作者:xiashixiang,如若转载,请注明出处:http://www.178linux.com/36454
评论列表(1条)
find命令是笔试中常见的考点,需要我们多加练习,予以掌握,课堂练习需要按时完成,通过练习,可以巩固我们所学的东西。