Linux文件查找之locate、find详解

 locate命令详解

locate命令其实是find -name的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库文件,这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。使用updatedb更新数据库时会占用系统的资源,特别是对特别复杂的目录或要文件较多时,要进行更新数据时,可选择系统空闲的时间段进行。

 

查询系统上预建的文件索引数据库

/var/lib/mlocate/mlocate.db

依赖于事先构建的索引;

索引的构建是在系统较为空闲时自动进行(周期性任务);管理员手动更新数据库(updatedb);

索引构建过程需要遍历整个根文件系统,极消耗资源;

工作特点:

查找速度快;

模糊查找;

非实时查找

搜索的是文件的全路径,不仅仅是文件名

可能只搜索用户具备读取和执行权限的目录,普通用户因为没有权限可能搜索不到root用户目录的文件

 

locate [OPTION]… [PATTERN]…

locate选项

-n, x只列举前x个匹配项目

-b, –basename 匹配唯一的路径名称的基本文件名  

-c, –count 只显示找到条目的号码  

-d, –database DBPATH 用 DBPATH 替代默认的数据库(/var/lib/mlocate/mlocate.db)  

-e, –existing 只显示当前存在的文件条目  

-L, –follow 当文件存在时跟随蔓延的符号链接 (默认)  

-h, –help 显示本帮助  

-i, –ignore-case 匹配模式时忽略大小写区别  

-l, –limit, -n LIMIT 限制为 LIMIT项目的输出 (或 计数)   

-m, –mmap 忽略向后兼容性  

-P, –nofollow, -H 当检查文件时不跟随蔓延的符号  

-0, –null 输出时以 NUL 分隔项目  

-S, –statistics 不搜索项目,显示有关每个已用数据库的统计信息  

-q, –quiet 不报告关于读取数据库的错误消息  

-r, –regexp REGEXP 搜索基本正则表达式 REGEXP 来代替模式  

–regex 模式是扩展正则表达式  

-s, –stdio 忽略向后兼容性  

-V, –version 显示版本信息  

-w, –wholename 匹配完整路径名 (默认) 

 

手动更新locate数据库

[root@localhost tmp]# ll /var/lib/mlocate/mlocate.db 
-rw-r-----. 1 root slocate 4349086 Aug 15 09:09 /var/lib/mlocate/mlocate.db
[root@localhost tmp]# updatedb
[root@localhost tmp]# ll /var/lib/mlocate/mlocate.db 
-rw-r-----. 1 root slocate 4354529 Aug 15 19:15 /var/lib/mlocate/mlocate.db

 

在当前系统上查找fstab文件

[root@localhost ~]# locate fstab
/etc/fstab
/etc/fstab.bak
/etc/selinux/targeted/modules/active/modules/updfstab.pp
/home/cyh/fstab.bak
/usr/lib/dracut/modules.d/95fstab-sys
/usr/lib/dracut/modules.d/95fstab-sys/module-setup.sh
/usr/lib/dracut/modules.d/95fstab-sys/mount-sys.sh
/usr/lib/systemd/system-generators/systemd-fstab-generator
/usr/share/augeas/lenses/dist/fstab.aug
/usr/share/augeas/lenses/dist/vfstab.aug
/usr/share/man/man5/fstab.5.gz
/usr/share/man/man8/systemd-fstab-generator.8.gz
/usr/share/vim/vim74/syntax/fstab.vim

 

搜索bin目录下的以“.sh”结尾的文件

[root@localhost ~]# locate bin/*.sh
/root/bin/1to100sum.sh
/root/bin/3.sh
/root/bin/3.sh1g5
/root/bin/3sum200.sh
/root/bin/AtoBsum.sh
/root/bin/Sum.sh
/root/bin/Te.sh

 

搜索/etc目录下所有以sh开头的文件

[root@localhost ~]# locate /etc/sh
/etc/shadow
/etc/shadow-
/etc/shadow.bak
/etc/shells

find命令详解

 

实时查找工具,通过遍历指定路径完成文件查找;

 

工作特点:

查找速度略慢

精确查找

实时查找

可能只搜索用户具备读取和执行权限的目录

 

语法:

find [OPTION]… [查找路径] [查找条件] [处理动作]

查找路径:指定具体目标路径;默认为当前目录

查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件

处理动作:对符合条件的文件做操作,默认输出至屏幕

 

查找条件


根据文件名和inode查找:

-name "文件名称":支持使用glob   *, ?, [], [^]

-iname "文件名称":不区分字母大小写

-inum n 按inode号查找

-samefile name 相同inode号的文件

-links n 链接数为n的文件

-regex "PATTERN":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称

 

根据属主、属组查找:

-user USERNAME:查找属主为指定用户(UID)的文件

-group GRPNAME: 查找属组为指定组(GID)的文件

-uid UserID:查找属主为指定的UID号的文件

-gid GroupID:查找属组为指定的GID号的文件

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

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

 

根据文件类型查找:

-type TYPE:

f: 普通文件

d: 目录文件

l: 符号链接文件

s:套接字文件

b: 块设备文件

c: 字符设备文件

p: 管道文件

 

组合条件:

与: -a

或: -o

非: -not, !

德·摩根定律:

非(P 且 Q) = (非 P) 或 (非 Q)

非(P 或 Q) = (非 P) 且 (非 Q)

!A -a !B = !(A -o B)

!A -o !B = !(A -a B)

 

根据文件大小来查找:

-size [+|-]#UNIT

常用单位: k, M, G

#UNIT: (#-1, #],如: 6k

-#UNIT: [0,#-1], 如: -6k

+#UNIT: (#,∞), 如: +6k

 

根据时间戳:

以“天”为单位;

-atime [+|-]#,

#: [#,#+1)

+#: [#+1,∞]

-#: [0,#)

-mtime

-ctime

以“分钟”为单位:

-amin

-mmin

-cmin

 

根据权限查找:

-perm [/|-]MODE

MODE: 精确权限匹配

/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系, + 从centos7开始淘汰

-MODE:每一类对象都必须同时拥有指定权限,与关系

0 表示不关注

find -perm 755 会匹配权限模式恰好是755的文件

只要当任意人有写权限时, find -perm +222就会匹配

只有当每个人都有写权限时, find -perm -222才会匹配

只有当其它人( other)有写权限时, find -perm -002才会匹配

 

处理动作

-print:默认的处理动作,显示至屏幕;

-ls:类似于对查找到的文件执行“ ls -l”命令

-delete:删除查找到的文件;

-fls file:查找到的所有文件的长格式信息保存至指定文件中

-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令

对于每个文件执行命令之前,都会交互式要求用户确认

-exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令

{}: 用于引用查找到的文件名称自身

find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令

有些命令不能接受过多参数,此时命令执行可能会失败,下面方式可规避此问题

find | xargs COMMAND

 

示例:

查找当前目录下面所有以“.txt”结尾的文件或目录

[root@localhost ~]# find -name "*.txt"
./.cache/tracker/db-version.txt
./.cache/tracker/db-locale.txt
./.cache/tracker/miner-applications-locale.txt
./.cache/tracker/last-crawl.txt
./.cache/tracker/first-index.txt
./.local/share/Trash/files/notepad.txt
./.local/share/Trash/files/Sublime.txt
./Desktop/Sublime.txt
./Desktop/windowstext.txt
./Desktop/linuxtext.txt
......

 

查找当前目录下面所有以字母u且后面跟一位数字,以“.sh”结尾的文件或目录

[root@localhost ~]# find -name "u[0-9].sh"
./u5.sh
./u1.sh
./u2.sh
./u8.sh
./u9.sh
./u4.sh

 

在当前目录下查找以f开头,后面至少跟一位数字,且以“.sh”结尾的文件

[root@localhost ~]# find -name "f[0-9]*.sh"
./bin/f1.sh
./bin/f2.sh
./f4d.sh
./f5t.sh

 

查找当前目录下面所有以“host”开头的文件或目录

[root@localhost ~]# find -name "host*"
./bin/hostping.sh
./etc2016-08-12/selinux/targeted/modules/active/modules/hostname.pp
./etc2016-08-12/host.conf
./etc2016-08-12/hosts
./etc2016-08-12/hosts.allow
./etc2016-08-12/hosts.deny
./etc2016-08-12/avahi/hosts
./etc2016-08-12/hostname
./etc2016-08-12/etc/selinux/targeted/modules/active/modules/hostname.pp
./etc2016-08-12/etc/host.conf
./etc2016-08-12/etc/hosts
./etc2016-08-12/etc/hosts.allow
./etc2016-08-12/etc/hosts.deny
./etc2016-08-12/etc/avahi/hosts
./etc2016-08-12/etc/hostname

 

查找Linux系统网卡配置文件

[root@localhost ~]# find /etc -name ifcfg-eno*
/etc/sysconfig/network-scripts/ifcfg-eno16777736
/etc/sysconfig/network-scripts/ifcfg-eno16777736.bak

 

查找/etc目录下面权限为755的文件或目录(/etc/ 或 /etc)

[root@localhost ~]# find /etc/ -perm 755 | more
/etc/
/etc/fonts
/etc/fonts/conf.d
/etc/X11
/etc/X11/fontpath.d
/etc/X11/applnk
/etc/X11/xorg.conf.d
/etc/X11/xinit
/etc/X11/xinit/xinitrc.d
/etc/X11/xinit/xinitrc.d/00-start-message-bus.sh
/etc/X11/xinit/xinitrc.d/localuser.sh
/etc/X11/xinit/xinitrc.d/50-xinput.sh
/etc/X11/xinit/xinitrc.d/xdg-user-dirs.sh
/etc/X11/xinit/xinitrc.d/zz-liveinst.sh
......

 

查找tmp目录下面所有者为root的文件或目录

[root@localhost ~]# find /tmp -user root -ls
   133    4 drwxrwxrwt  16 root     root         4096 Aug 15 18:06 /tmp
102476982    0 drwxrwxrwt   2 root     root           17 Aug  7 15:14 /tmp/.ICE-unix
105106828    0 srwxrwxrwx   1 root     root            0 Aug  7 15:14 /tmp/.ICE-unix/7118
798851    0 drwxrwxrwt   2 root     root            6 Aug  8 09:51 /tmp/.X11-unix
34830676    0 drwxrwxrwt   2 root     root            6 Jul 21 11:27 /tmp/.font-unix
67838375    0 drwxrwxrwt   2 root     root            6 Jul 21 11:27 /tmp/.Test-unix
102476984    0 drwxrwxrwt   2 root     root            6 Jul 21 11:27 /tmp/.XIM-unix
860203    4 -rwxr--r--   1 root     root          140 Aug 15 10:40 /tmp/per.sh
860212    0 -rwxr--r--   1 root     root            0 Aug 12 19:23 /tmp/1.sh
2494902    0 -rw-r--r--   1 root     root            0 Aug 12 19:23 /tmp/1.sh1
......

 

在/etc目录下查找更改时间在5天以内的所有文件和目录

[root@localhost ~]# find /etc/ -mtime -5 -ls
67149953   12 drwxr-xr-x 129 root     root         8192 Aug 15 16:47 /etc/
69909531    4 -rw-r--r--   1 root     root          129 Aug 15 16:47 /etc/resolv.conf
69909533    4 -rw-r--r--   1 root     root         1301 Aug 15 14:43 /etc/group
69909534    4 ----------   1 root     root         1031 Aug 15 14:43 /etc/gshadow
67811198    4 -rw-r--r--   1 root     root         1287 Aug 15 14:42 /etc/group-
69909532    4 -rw-r--r--   1 root     root         2934 Aug 15 14:43 /etc/passwd
67811196    4 ----------   1 root     root         1021 Aug 15 14:42 /etc/gshadow-
69909535    4 ----------   1 root     root         1857 Aug 15 14:43 /etc/shadow
33557926    4 drwxr-xr-x   6 root     root         4096 Aug 15 14:18 /etc/sysconfig
......

 

在/etc目录下查找更改时间在5天以内的普通文件

[root@localhost ~]# find /etc -mtime -5 -type f -ls
69909531    4 -rw-r--r--   1 root     root          129 Aug 15 16:47 /etc/resolv.conf
69909533    4 -rw-r--r--   1 root     root         1301 Aug 15 14:43 /etc/group
69909534    4 ----------   1 root     root         1031 Aug 15 14:43 /etc/gshadow
67811198    4 -rw-r--r--   1 root     root         1287 Aug 15 14:42 /etc/group-
69909532    4 -rw-r--r--   1 root     root         2934 Aug 15 14:43 /etc/passwd
67811196    4 ----------   1 root     root         1021 Aug 15 14:42 /etc/gshadow-
69909535    4 ----------   1 root     root         1857 Aug 15 14:43 /etc/shadow
67811575    4 -rw-r--r--   1 root     root         2893 Aug 15 14:42 /etc/passwd-
67811577    4 ----------   1 root     root         1829 Aug 15 14:42 /etc/shadow-
2494903    0 -rwxr-xrwx   1 root     root            0 Aug 13 14:37 /etc/rc.d/init.d/file2
36340025    4 -rw-r--r--   1 root     root           14 Aug 15 14:18 /etc/tuned/active_profile

 

查找属于root用户不属于root组的文件

[root@localhost ~]# find -user root -not -group root -ls
105121001    4 -rw-------   1 root     daemon         30 Jun 10  2014 ./etc2016-08-12/ppp/peers/wvdial
105121006    4 -rw-r-----   1 root     ssh_keys     1679 Jul 21 11:47 ./etc2016-08-12/ssh/ssh_host_rsa_key
105121008    4 -rw-r-----   1 root     ssh_keys      227 Jul 21 11:47 ./etc2016-08-12/ssh/ssh_host_ecdsa_key
105121010    4 -rw-r-----   1 root     ssh_keys      387 Jul 21 11:47 ./etc2016-08-12/ssh/ssh_host_ed25519_key
69760948    0 drwxr-x---   7 root     polkitd        93 Jul 21 11:27 ./etc2016-08-12/polkit-1/localauthority
36383394    4 -rw-r-----   1 root     chrony          9 Nov 24  2015 ./etc2016-08-12/chrony.keys
2198753    4 drwxr-xr-x   5 root     lp           4096 Aug  8 08:15 ./etc2016-08-12/cups
2198755    0 -rw-------   1 root     lp              0 Nov 20  2015 ./etc2016-08-12/cups/classes.conf
2198756    0 -rw-r--r--   1 root     lp              0 Nov 20  2015 ./etc2016-08-12/cups/client.conf
2198757    4 -rw-r-----   1 root     lp           3091 Jul 21 11:29 ./etc2016-08-12/cups/cups-files.conf
2198758    8 -rw-r-----   1 root     lp           4504 Nov 20  2015 ./etc2016-08-12/cups/cupsd.conf

提示删除存在时间超过3天以上的root的临时文件

[root@localhost ~]# find /tmp/ -ctime +3 -user root -ok rm {} \;
< rm ... /tmp/.ICE-unix/7118 > ?

原创文章,作者:cyh5217,如若转载,请注明出处:http://www.178linux.com/36082

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-19 10:27

    对于文件查找,我们用的最多的工具是find命令,这也是笔试中必考的内容,希望能多加练习,熟练掌握。

联系我们

400-080-6560

在线咨询

工作时间:周一至周五,9:30-18:30,节假日同时也值班

QR code