曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 2999|回复: 0
打印 上一主题 下一主题

locate --  根据文件名查找文件

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2013-5-13 21:34:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
locate 命令可以根据文件名(支持通配符与正则表达式)。该命令查找文件与 find 命令不同,它是从数据库中进行检索,而非实时查找。这样一来,他的有点是速度非常快,其缺点是不能实时反映新建的文件。如果希望能检索到新建的文件,那么需要用到另一个命令 updatedb 来更新一下数据库。实际上,这个更新的动作一般是通过 cron 进行定时更新的,并且这些被查询更新的数据库也可能不止一个。

先看一个简单的例子:
[beyes@groad.net ~]$ locate attack
/home/beyes/c/attack
/home/beyes/c/attack.c
/home/beyes/tmp/attack
像这种,直接在 locate 后面加一个字符串且不用 -regex 选项的情况下,locate 会自动将该字符串展开为 *PATTERN* 形式,也就是前后通配符的扩展。比如上面的 attack 会被展开成 *attack*

默认情况下,locate 不会检查输出结果中的文件是否存在。这些文件可能在下一次 updatedb 之前已经被删除,但在数据库里仍然存在其路径信息。另外,locate 也不会输出 updatedb 之前创建的文件。

如果检索都匹配的结果,那么 locate 的退出状态为 0 ,否则为 1。比如:
[beyes@groad.net ~]$ locate attack; echo $?
/home/beyes/c/attack
/home/beyes/c/attack.c
/home/beyes/tmp/attack
0

-b, --basename : 指定 base name 来搜索 ,而不是通符或正则表达式的匹配方式:
[beyes@groad.net ~]$ locate -b '\attack'
/home/beyes/c/attack
/home/beyes/tmp/attack
注意上面的命令中,-b 选项后面的参数(base name)必须用单引号括起来,并且 attack (base name)的前面要加上 '\' 符号,它的意义是取消 PATTERN 扩展成 *PATTERN* 。

-c, --count : 统计匹配的行数,而不输出匹配结果:
[beyes@groad.net ~]$ locate -b 'attack' -c
3

-d, --database : 指定自定义的数据库路径。默认的数据库路径为: /var/lib/mlocate/mlocate.db 。如果你有自己的一个数据库,那么可用此选项来指定。

-e, --existing : 打印出实际存在的文件。
上面说过,locate 默认不会检查文件是否存在,但是用该选项,可以进行检测,如果文件不存在则不输出:
[beyes@groad.net c]$ mv attack attack.bak         #重命名文件
[beyes@groad.net c]$ locate -b 'attack'
/home/beyes/c/attack
/home/beyes/c/attack.c
/home/beyes/tmp/attack
[beyes@groad.net c]$ locate -e -b 'attack'
/home/beyes/c/attack.c
/home/beyes/tmp/attack
上面重命名了文件,如果不用 -e 选项,那么存储在数据库中的文件信息仍然会输出来;但是使用了 -e 选项后,它就不会输出来了。注意此举不会更新数据库信息。

-i, --ignore-case : 忽略大小写。

--regex : 使用正则表达式。
[beyes@groad.net c]$ locate --regex a[0-9][5-8][a-m] | head -n 3
/lib/modules/2.6.32-358.el6.i686/kernel/drivers/media/rc/keymaps/rc-avermedia-a16d.ko
/lib/modules/2.6.32-358.el6.i686/kernel/drivers/video/vga16fb.ko
/var/cache/fontconfig/830f035fa84a65ce80e050178dbb630d-le32d4.cache-3

-S, --statistics : 打印出每次读取数据库时所要检索的信息量:
[beyes@groad.net c]$ locate -S
Database /var/lib/mlocate/mlocate.db:
        17,964 directories
        211,833 files
        11,796,386 bytes in file names
        4,833,478 bytes used to store database
-l, --limit, -n LIMIT : 限制输出结果的条数。当找到匹配的条数等于 LIMIT 时,locate 不再查找,而直接成功退出。如果已经指定了 --count 选项,若是 count 大于等于 LIMIT 时,那么在达到 LIMIT 数时也会退出,并报告 共有 LIMIT 条结果。

-0, --null : 在默认情况下,打印结果是一行一条。如果使用该选项,那么换行符将被 \0 来代替,这样就没有了换行的效果。估计这么用的情况会很少。


-L, --follow : 要求检索结果的同时,跟随检查符号链接,如果相应的符号链接已经损坏,那么该条目不会被输出来。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-19 18:28 , Processed in 0.077573 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表