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条)
对于文件查找,我们用的最多的工具是find命令,这也是笔试中必考的内容,希望能多加练习,熟练掌握。