功能介绍:
locate命令其实是find -name的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/locatedb,值得注意的是:版本不同,会有所不同。有的版本位置是 /var/lib/mlocate/mlocatedb ,还有的是/var/lib/slocate/slocate.db ,这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。
语法格式:locate [参数] [样式]
常用参数:
-d<目录>或–database=<目录>
指定数据库所在的目录
–help
显示帮助
–version
显示版本信息
参考实例:
显示帮助 :
[root@linuxcool ~]# locate --help Usage: locate [OPTION]… [PATTERN]… Search for entries in a mlocate database. -A, --all only print entries that match all patterns -b, --basename match only the base name of path names -c, --count only print number of found entries -d, --database DBPATH use DBPATH instead of default database (which is /var/lib/mlocate/mlocate.db) -e, --existing only print entries for currently existing files -L, --follow follow trailing symbolic links when checking file existence (default) -h, --help print this help -i, --ignore-case ignore case distinctions when matching patterns -l, --limit, -n LIMIT limit output (or counting) to LIMIT entries -m, --mmap ignored, for backward compatibility -P, --nofollow, -H don't follow trailing symbolic links when checking file existence -0, --null separate entries with NUL on output -S, --statistics don't search for entries, print statistics about each used database -q, --quiet report no error messages about reading databases -r, --regexp REGEXP search for basic regexp REGEXP instead of patterns --regex patterns are extended regexps -s, --stdio ignored, for backward compatibility -V, --version print version information -w, --wholename match whole path name (default) Report bugs to mitr@redhat.显示版本信息:[root@linuxcool ~]# locate --version mlocate 0.26 Copyright (C) 2007 Red Hat, Inc. All rights reserved. This software is distributed under the GPL v.2. This program is provided with NO WARRANTY, to the extent permitted by law.
搜索/etc目录下所有以sh开头的文件:
[root@linuxcool ~]# locate /etc/sh /etc/shadow /etc/shadow- /etc/shells
搜索/etc目录下以k开头的文件:
[root@linuxcool ~]# locate /etc/k /etc/kdumpnf /etc/kernel /etc/krb5nf /etc/krb5nf.d /etc/ksmtunednf /etc/kernel/postinst.d /etc/kernel/postinst.d/51-dracut-rescue-postinst.sh
查找和pwd相关的所有文件:
[root@linuxcool ~]# locate pwd /boot/extlinux/pwd.c32 /etc/d.lock /usr/bin/pwd /usr/bin/pwdx /usr/include/pwd.h /usr/lib/modules/3.10.0-514.el7.x86_64/kernel/drivers/watchdog/hpwdt.ko /usr/lib64/cracklib_dictd /usr/lib64/python2.7/lib-dynload/spwdmodule /usr/sbin/unix_chkpwd /usr/share/cracklib/cracklib-smalld /usr/share/cracklib/pw_dictd /usr/share/man/man0p/pwd.h.0p.gz /usr/share/man/man1/pwd.1.gz /usr/share/man/man1/pwdx.1.gz /usr/share/man/man1p/pwd.1p.gz /usr/share/man/man3/lckpwdf.3.gz /usr/share/man/man3/ulckpwdf.3.gz /usr/share/man/man8/unix_chkpwd.8.gz /usr/share/man/overrides/de/man1/pwdx.1 /usr/share/man/overrides/fr/man1/pwdx.1 /usr/share/man/overrides/uk/man1/pwdx.1 /usr/share/syslinux/pwd.c32 /usr/src/kernels/3.10.0-514.el7.x86_64/include/config/hpwdt /usr/src/kernels/3.10.0-514.el7.x86_64/include/config/hpwdt/nmi /usr/src/kernels/3.10.0-514.el7.x86_64/include/config/hpwdt/nmi/decoding.h
locate与find是经常使用的Linux 命令,刚接触Linux时对这两个命令的使用傻傻的分不清。现在我们来对比一下两个命令到底有哪些区别。 |
locate
locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案。其方法是先建立一个包括系统内所有档案名称及路径的数据库,之后当寻找时就只需查询这个数据库,而不必实际深入档案系统之中了。在一般的 distribution 之中,数据库的建立都被放在 crontab 中自动执行。
1. 命令格式:
Locate [选择参数] [样式]
2.命令功能:
locate命令可以在搜寻数据库时快速找到档案,locate为模糊查找,数据库由updatedb程序来更新,updatedb是由cron daemon周期性建立的,locate命令在搜寻数据库时比由整个由硬盘资料来搜寻资料来得快,但较差劲的是locate所找到的档案若是最近才建立或 刚更名的,可能会找不到,在内定值中,updatedb每天会跑一次,可以由修改crontab来更新设定值。(etc/crontab)
locate指定用在搜寻符合条件的档案,它会去储存档案与目录名称的数据库内,locate查询文件时,会去搜索/var/lib/mlocate/mlocage.db,寻找合乎范本样式条件的档案或目录录,可以使用特殊字元(如”*” 或”?”等)来指定范本样式,如指定范本为kcpa*ner, locate会找出所有起始字串为kcpa且结尾为ner的档案或目录,如名称为kcpartner若目录录名称为kcpa_ner则会列出该目录下包括 子目录在内的所有档案。
locate指令和find找寻档案的功能类似,但locate是透过update程序将硬盘中的所有档案和目录资料先建立一个索引数据库,在 执行loacte时直接找该索引,查询速度会较快,索引数据库一般是由操作系统管理,但也可以直接下达update强迫系统立即修改索引数据库。
3.命令参数:
-e 将排除在寻找的范围之外。
-1 如果 是 1.则启动安全模式。在安全模式下,使用者不会看到权限无法看到 的档案。这会始速度减慢,因为 locate 必须至实际的档案系统中取得档案的权限资料。
-f 将特定的档案系统排除在外,例如我们没有到理要把 proc 档案系统中的档案 放在资料库中。
-q 安静模式,不会显示任何错误讯息。
-n 至多显示 n个输出。
-r 使用正规运算式 做寻找的条件。
-o 指定资料库存的名称。
-d 指定资料库的路径
-h 显示辅助讯息
-V 显示程式的版本讯息
4.使用实例:
实例1:搜索etc目录下所有以sh开头的文件
[root@CentOS7 ~#]locate /etc/sh /etc/shadow/etc/shadow-/etc/shells[root@centos7 ~#]locate -r "/etc/\sh " # 正则,锚定词首/etc/shadow/etc/shadow-/etc/shells[root@centos7 ~#]
实例2:忽略大小写
[root@centos7 ~#]locate -i ~/d/root/Desktop/root/Documents/root/Downloads/root/d1/root/dd/var/lib/pcp/pmdas/root/domain.h[root@centos7 ~#]
实例3:更新数据库
[root@centos7 ~#]locate ~/a/root/anaconda-ks.cfg[root@centos7 ~#]updatedb[root@centos7 ~#]locate ~/a/root/a.sh/root/anaconda-ks.cfg[root@centos7 ~#]
find
1. 主要用途:
find命令是一个实时查找工具,通过遍历指定路径而完成对文件的查找;在使用该命令时,如果不选定参数,则在当前目录下查找子目录与文件并显示之;另外,任何位于参数之前的字符串,都将视为欲查找的目录名。由于是实时遍历查找,find有如下特性:精确实时查找,速度慢可能只搜索用户具备读取和执行权限的目录。
2.find语法:
find [OPTION]... [查找路径] [查找条件] [处理动作]
查找路径:指定具体目标路径,默认为当前目录
查找条件:指定的查找标准,可以是文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
处理动作:对符合条件的文件做操作,默认输出至屏幕
3.查找条件:
1. 根据文件名和inode查找2. 根据属主、属组查找3. 根据文件类型查找4. 根据逻辑组合条件查找5. 根据文件大小来查找6. 根据时间戳来查找7. 根据权限来查找
4.处理动作:
1. -print: 默认动作,显示至屏幕2. -ls: 类似于对查找到的文件执行 ls -l 命令3. -delete: 删除查找到的文件4. -fls file: 查找到的所有长格式的信息保存至指定文件中5. -ok COMMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,且都会交互式要求用户确认6. -exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令;7. {}: 用于引用查找至的文件名称自身8. find 传递查找到的文件至后面指定的命令时,查找到所有符号条件的文件一次性传递给后面的命令9. 有些命令不能接受过多的参数,此时命令执行可能会失败,用 xargs 来规避此问题find |xargs COMMAND
5.常用参数:
文件名和inode类:
-name "文件名称": 支持使用glob, *, ?, [], [^] -iname "文件名称": 不区分字母大小写 -inum n: 按inode号查找 -somefile name: 相同的inode号文件 -links n: 链接数为n的文件 -regex "PATTERN": 以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称
属主属组类:
-user USERNAME: 查找属主为指定用户(UID)的文件 -group GROUPNAME: 查找属组为指定组(GID)的文件 -uid UserID: 查找属主为指定的UID号的文件 -gid GroupID: 查找属组为指定的GID号的文件 -nouser: 查找没有属主的文件 -nogroup: 查找没有属组的文件
文件类型类:
b block (buffered) specialc character (unbuffered) speciald directoryp named pipe (FIFO)f regular filel symbolic links socket
逻辑组合条件类:
组合条件:
与:-a或:-o非:-not, !
摩根定律:
(非P) 或(非Q) = 非(P且Q)(非P) 且 (非Q) = 非(P或Q)
文件大小类:
-size [+|-]#UNIT 常用单位:k,M,G #UNIT: (#-1,#] 如:5M 表示 (4M,5M]-#UNIT: [0,#-1] 如:-5M 表示 [0,5M]+#UNIT: (#,oo) 如:+5M 表示 (6M,oo)
关于文件大小类的解释:为什么-size 5M 还是找精确的5M而是表示(4M,5M], 试想文件的大小指什么?是指文件数据的大小还是包括了元数据后的大小,那你找元数据的大小有意义吗?但文件的大小肯定是包含元数据大小的,而我们一般以文件大小找文件时往往考虑的是文件数据的大小;另外,精确查找一定大小的文件意义不大;所以这里的大小会有1个单位的浮动。
时间戳类:
以”天”为单位: -atime [+|-]# #: [#,#+1) +#: [#+1,oo) -#: [0,#) -mtime -ctime以“分钟”为单位: -amin -mmin -cmin
关于时间戳类的解释:为什么-atime 3 表示的是 [3,4),这个就很好解释了,我们这儿所说的时间是指时间段而非时刻,一“天”与一“分钟”都是指一个时间段,只有[3,4)这个半闭半开的区间才能完整地表示第三天。
权限类:
-perm [/|-]MODE MODE: 精确匹配权限 /MODE: 任何一类(u,g,o)对象的权限中只要能一位匹配即可,属于或关系。以前用'+',CentOS 7以'/'替代之 -MODE: 每一类对象都必须同时拥有指定权限,属于与关系 0:表示不关注
示例:
find -perm 644 表示要严格匹配644的文件find -perm +222 表示u,g,o任何一类用户有写权限即匹配find -perm -222 表示仅严格匹配写权限,即每个用户必须要有写权限find -perm -002 表示仅严格匹配other用户的写权限
6.使用示例:
实例1:将配置文件备份到指定目录下并添加扩展名
[root@localhost ~]# find . -name "*nf" -exec cp -r {} /testdir/{} \; [root@localhost ~]# cd /testdir/[root@localhost testdir]# lsanf bnf[root@localhost testdir]#
实例2:.提示删除存在时间超过3天以上的属主为young的临时文件
[root@localhost ~]# find /tmp -ctime +3 -user young -exec rm -fr {} \;[root@localhost ~]#
实例3:在主目录中查找可被其它用户写入的文件
[root@localhost ~]# find ~ -perm -002/root/num[root@localhost ~]# find ~ -perm -002 -exec chmod o-w {} \;[root@localhost ~]# ll num--w--w---- 1 root root 35 Jan 21 05:55 num
实例4:查找/var目录下属主为root,且属组为mail的所有文件
[root@localhost ~]# find /var -user root -group mail -ls #默认关系就是与1179652 4 drwxrwxr-x 2 root mail 4096 Jan 23 11:04 /var/spool/mail
实例5:查找/var目录下不属于root、lp、gdm的所有文件
[root@localhost ~]# find /var ! -user root ! -user lp ! -user gdm
实例6:查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件
[root@localhost ~]# find /var/ -mtime -7 ! -user root ! -user postfix -ls1179676 4 drwx------ 3 daemon daemon 4096 Jan 23 11:04 /var/spool/at524399 4 drwx------ 2 nginx nginx 4096 Jan 23 03:16 /var/log/nginx524413 0 -rw-r--r-- 1 nginx root 0 Jan 23 03:16 /var/log/nginx/access.log524391 0 -rw-r--r-- 1 nginx root 0 Jan 21 03:44 /var/log/nginx/error.log132174 4 drwx------ 3 nginx nginx 4096 Jan 21 03:44 /var/lib/nginx132175 4 drwx------ 7 nginx nginx 4096 Jan 21 03:44 /var/lib/nginx/tmp132173 4 drwx------ 2 nginx root 4096 Jan 21 03:44 /var/lib/nginx/tmp/client_body132219 4 drwx------ 2 nginx root 4096 Jan 21 03:44 /var/lib/nginx/tmp/proxy132221 4 drwx------ 2 nginx root 4096 Jan 21 03:44 /var/lib/nginx/tmp/uwsgi132222 4 drwx------ 2 nginx root 4096 Jan 21 03:44 /var/lib/nginx/tmp/scgi132220 4 drwx------ 2 nginx root 4096 Jan 21 03:44 /var/lib/nginx/tmp/fastcgi
实例7:查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件
[root@bash ~]# find / -nouser -o -nogroup -a -atime -7
实例8:查找/etc目录下大于1M且类型为普通文件的所有文件
[root@bash ~]# find /etc/ -size +1M -type f/etc/selinux/targeted/policy/policy.29/etc/udev/hwdb.bin
实例9:查找/etc目录下所有用户都没有写权限的文件
[root@bash ~]# find /etc/ ! -perm /222/etc/pki/ca-trust/extracted/java/cacerts/etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem/etc/pki/ca-trust/extracted/pem/email-ca-bundle.pem/etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem/etc/lvm/profile/cache-mqfile/etc/lvm/profile/cache-smqfile/etc/lvm/profile/command_profile_templatefile/etc/lvm/profile/metadata_profile_templatefile/etc/lvm/profile/thin-genericfile/etc/lvm/profile/thin-performancefile/etc/openldap/certs/password/etc/gshadow/etc/dbus-1/system.d/cupsnf/etc/shadow/etc/gshadow-/etc/ldnf.d/kernel-3.10.0-327.el7.x86_64nf/etc/shadow-/etc/udev/hwdb.bin/etc/machine-id/etc/pam.d/cups/etc/sudoers
实例10:查找/etc目录下至少有一类用户没有执行权限的文件
[root@bash ~]# find /etc/ ! -perm -111 # 至少有一类用户没有就是所有用户都没有
实例11:.查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件
[root@bash ~]# find /etc/init.d -perm -113/etc/init.d
或者
[root@bash ~]# find /etc/init.d -perm -111 -perm -002/etc/init.d
实例12:摩根定律找出/tmp目录下,属主不是root,且文件名不以f开头的文件
[root@centos7 ~]#find /tmp \( -not -user root -a -not -name 'f*' \) -ls即[root@centos7 ~]#find /tmp -not \( -user root -o -name 'f*' \) -ls
实例13:查找/etc/下,除/etc/sane.d目录的其它所有nf后缀的文件
[root@bash ~]# find /etc -path '/etc/sane.d' -prune -o -name '*nf'
实例14:匹配文件路径或文件
[root@bash ~]# find /usr/ -path '*local'/usr/bin/abrt-action-analyze-ccpp-local/usr/share/doc/postfix-2.10.1/examples/qmail-local/usr/share/aclocal/usr/libexec/postfix/local/usr/local
实例15:基于正则表达式匹配文件路径
[root@bash ~]# find . -regex ".*txt$" ./.mozilla/firefox/4dqu966q.default/revocations.txt./vimrc/spf13-vim/LICENSE.txt./a.txt
本文原创地址:/d/file/gt/2023-09/zahwcy0zomp