0051. shell命令--locate

发布于:2025-02-11 ⋅ 阅读:(29) ⋅ 点赞:(0)

51. shell命令--locate

功能说明

        locate 命令是 Linux 系统上一个非常实用的工具,用于快速查找文件系统中符合条件的文件或目录的路径。它通过预先构建的数据库来工作,而不是实时搜索整个文件系统,因此搜索速度非常快。这个数据库通常是由 updatedb 命令定期更新(通常是每天或根据系统配置)来保持最新状态的。

        ​locate 命令用于查找符合条件的文档,他会去保存文档和目录名称的数据库内,查找合乎范本样式条件的文档或目录。一般情况我们只需要输入 locate your_file_name 即可查找指定文件。CentOS 7已经没有此命令,需手动安装,方法为:yum install -y mlocate

        ​ locate 命令用来查找文件或目录。 locate 命令要比 find -name快得多,原因在于它不搜索具体目录,而是搜索一个数据库 /var/lib/mlocate/mlocate.db 。这个数据库中含有本地所有文件信息。Linux 系统自动创建这个数据库,并且每天自动更新一次,因此,我们在用 whereis 和 locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。为了避免这种情况,可以在使用locate 之前,先使用 updatedb 命令,手动更新数据库。整个 locate 工作其实是由四部分组成的:

  • 1. /usr/bin/updatedb 主要用来更新数据库,通过 crontab 自动完成的
  • 2. /usr/bin/locate 查询文件位置
  • 3. /etc/updatedb.conf updatedb的配置文件
  • 4. /var/lib/mlocate/mlocate.db 存放文件信息的文件

语法格式

locate [选项]... [模式]...
# 模式:你想要搜索的文件名或路径模式。可以使用通配符(如 * 表示任意多个字符,? 表示任意单个字符)来指定搜索模式。
SYNOPSIS
       locate [OPTION]... PATTERN...

选项说明

-b, --basename -- 仅匹配路径名的基本名称
-c, --count -- 只输出找到的数量
-d, --database DBPATH -- 使用 DBPATH 指定的数据库,而不是默认数据库 /var/lib/mlocate/mlocate.db
-e, --existing -- 仅打印当前现有文件的条目
-1 -- 如果 是 1.则启动安全模式。在安全模式下,使用者不会看到权限无法看到 的档案。这会始速度减慢,因为 locate 必须至实际的档案系统中取得档案的 权限资料。
-0, --null -- 在输出上带有NUL的单独条目
-S, --statistics -- 不搜索条目,打印有关每个数据库的统计信息
-q -- 安静模式,不会显示任何错误讯息。
-P, --nofollow, -H -- 检查文件存在时不要遵循尾随的符号链接
-l, --limit, -n LIMIT -- 将输出(或计数)限制为LIMIT个条目
-n -- 至多显示 n个输出。
-m, --mmap -- 被忽略,为了向后兼容
-r, --regexp REGEXP -- 使用基本正则表达式
--regex -- 使用扩展正则表达式
-q, --quiet -- 安静模式,不会显示任何错误讯息
-s, --stdio -- 被忽略,为了向后兼容
-o -- 指定资料库存的名称。
-h, --help -- 显示帮助
-i, --ignore-case -- 忽略大小写
-V, --version -- 显示版本信息

实践操作

0. 环境准备
yum provides locate
yum install -y mlocate    #安装此命令

1. 查找 passwd 文件
locate passwd
updatedb    #默认情况下 updatedb 每天执行一次,一般是系统自己维护,也可以手工升级数据库 
locate passwd
locate '*.conf'
locate '*.conf' |wc -l
locate -r '\.txt$'    #注意,这里的正则表达式需要转义
locate -r '\.txt$' |wc -l

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

3. 忽略大小写搜索当前用户目录下所有以 . 开头的文件
locate -i ~/.

4. 仅显示前 10 个匹配项
locate -n 10 *.cfg
locate -n 10 *.rpm
locate -n 10 *.txt

5. 使用 null 字符作为分隔符,适合 xargs 使用
# locate -0 somefile | xargs -0 somecommand
locate -n 10 -0 *1.gz |xargs -0 ls

6. 搜索特定类型的文件
locate -0 '*' | xargs -0 file | grep 'executable'
# 这个命令组合首先使用 locate 查找所有文件(使用 null 字符作为分隔符以避免文件名中的特殊字符问题),
# 然后通过 xargs 将这些文件名传递给file命令来识别它们的类型,最后通过 grep 筛选出标记为可执行的文件。

7. 使用 locate 查找大文件
#这里,xargs -I {}选项允许我们将 locate 的输出作为 find 命令的参数,
#而find {} -type f -size +10M则用于查找大于1MB的文件。
locate '*.log' | xargs -I {} find {} -type f -size +1M

8. 手动更新数据库必要性演示
touch newfile.txt
locate newfile.txt    #数据库没更新,所以找不到
updatedb    #更新数据库
locate newfile.txt    #能找到该文件了
rm -rf newfile.txt    #删除文件
locate newfile.txt    #任然能找到
updatedb    #更新数据库
locate newfile.txt    #找不到了

9. updatedb 的配置文件 /etc/updatedb.conf
cat /etc/updatedb.conf

PRUNE_BIND_MOUNTS = "yes"
PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs devpts ecryptfs exofs fuse fuse.sshfs fusectl gfs gfs2 gpfs hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf usbfs fuse.glusterfs ceph fuse.ceph"
PRUNENAMES = ".git .hg .svn"
PRUNEPATHS = "/afs /media /mnt /net /sfs /tmp /udev /var/cache/ccache /var/lib/yum/yumdb /var/spool/cups /var/spool/squid /var/tmp /var/lib/ceph"

# 第一行 PRUNE_BIND_MOUNTS="yes" 的意思是:是否进行限制搜索。
# ​第二行是排除检索的文件系统类型,即列出的文件系统类型不进行检索。
# ​第三行表示对哪些后缀的文件排除检索,也就是列在这里面的后缀的文件跳过不进行检索。不同后缀之间用空格隔开。
# ​第四行是排除检索的路径,即列出的路径下的文件和子文件夹均跳过不进行检索。 updatedb 之后使用 locate 仍然找不到想要文件可以检查挂载的目录是否被忽略了

注意事项

  • 由于 locate 依赖于预先构建的数据库,如果文件是最近才创建的或者最近被删除但数据库尚未更新,那么 locate 可能无法找到这些文件或仍显示已删除的文件。
  • 可以通过运行 sudo updatedb 来手动更新数据库(需要相应的权限)。
  • 某些系统可能配置为在文件被创建或删除时自动更新数据库,但这取决于具体的系统配置和使用的工具。
  • locate 命令是 Linux 系统中一个强大的文件搜索工具,通过预先构建的数据库提供快速的搜索功能。通过灵活运用其基本选项和结合其他命令,你可以有效地执行各种复杂的文件搜索任务。然而,需要注意的是,由于 locate 依赖于数据库,因此它可能无法反映文件系统的最新变化,直到数据库被更新为止。

网站公告

今日签到

点亮在社区的每一天
去签到