文件查找工具:locate和find

locate

locate命令主要依赖于事先构建好的索引库。索引库中收集了系统中所有文件的路径信息。索引库一般通过系统的周期性任务实现自动更新,也可使用updatedb命令进行手动更新。更新索引库是一个很消耗系统资源的操作,一般在系统空闲时进行。

locate在进行文件查找时,根据给出的指定字符串,在索引库中进行查找,并打印出绝对路径中包含该字符串的文件,提高了查找速度的同时,避免了遍历文件系统带来的系统资源的消耗。但带来的是文件查找的非实时性。如果某个文件创建后没有进行索引库的更新,那么索引库中没有该文件的信息,使用locate命令也将查找不到该文件。

基于locate这样的工作原理,使得它具有 查找速度快、模糊查找和非实时查找 的特点。

虽然locate命令是模糊查找的,但我们可以通过灵活使用-b选项和正则表达式的位置锚定,以实现精准查找。

locate使用格式及常用选项:

  • SYNOPSIS:
    locate [OPTION]… PATTERN…

  • OPTIONS:

    • -b:只匹配路径中的基名;
    • -c:统计出共有多少个符合条件的文件;
    • -r:使用基本正则表达式 (BRE) 进行匹配;
  • PATTREN:
    locate的匹配模式默认使用glob风格,当使用-r选项时,可使用基本正则表达式模式进行匹配。

locate使用示例:

使用locate查找绝对路径中包含“mailx”的文件:

[root@localhost ~]# locate 'mailx'
/usr/bin/mailx
/usr/share/doc/mailx-12.5
/usr/share/doc/mailx-12.5/AUTHORS
/usr/share/doc/mailx-12.5/COPYING
/usr/share/doc/mailx-12.5/README
/usr/share/man/man1/mailx.1.gz

使用locate查找基名中包含“mailx”的文件:

[root@localhost ~]# locate -b 'mail'
/usr/bin/mailx
/usr/share/doc/mailx-12.5
/usr/share/man/man1/mailx.1.gz

locate使用glob匹配模式查找文件:

[root@localhost ~]# locate -b 'mail?'
/usr/bin/mailq
/usr/bin/mailx

locate启用基本正则表达式,查找基名为“mail”和“mailx”的文件:

[root@localhost ~]# locate -br '^mailx\?$'
/usr/bin/mail
/usr/bin/mailx
/var/mail
/var/spool/mail

find

find命令是一个文件实时查找工具。它通过遍历指定路径下的文件系统层级结构完成文件查找。此外,它还能对查找到的文件进行一些处理动作。

find命令查找具有查找准确实时性查找的特点,但消耗的系统资源较多,查找速度略慢

find使用格式及常用选项:

  • SYNIPSIS:
    find [OPTIONS] [查找起始路径] [查找条件] [处理动作]

  • OPTIONS:

    • 查找起始路径:指定搜索范围;缺省时默认为当前目录。
    • 查找条件:指定的查找标准,可以更加文件名、大小、类型、从属关系、权限等待标准进行;缺省时表示查找指定目录下的所有文件。
    • 处理动作:对符合查找条件的文件做出的操作;默认为输出至标准输出。

查找条件:

根据文件名查找:

-name “pattern”:根据文件名精准查找,区分大小写;
-iname “pattern”:根据文件名精准查找,不区分大小写;
pattern支持glob风格匹配模式。
-regex pattern:基于正则表达式模式查找文件,匹配的是整个路径,而非文件或目录的基名。

匹配/etc目录下基名为"passwd"的文件或目录(区分大小写):
[root@localhost ~]# find /etc -name passwd
/etc/passwd
/etc/pam.d/passwd

匹配/etc目录下基名为"passwd"的文件或目录(区分大小写):
[root@localhost ~]# find /etc -iname passwd
/etc/passwd
/etc/pam.d/passwd
/etc/Passwd

根据文件从属关系查找:

-user USERNAME:查找属主为指定用户的所有文件;

[root@localhost ~]# find /home -user Kamin

-group GRPNAME:查找属组为指定组的所有文件;

[root@localhost ~]# find /home -gruop Kamin

-uid UID:查找属于指定UID的文件;

[root@localhost ~]# find /home -uid 1000

-gid GID:查找属于指定GID的文件;

[root@localhost ~]# find /home -gid 1000

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

[root@localhost ~]# find /home -nouser

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

[root@localhost ~]# find /home -nogruop

根据文件的类型查找:

-type TYPE:

  • f:普通文件
  • d:目录文件
  • l:符号链接文件
  • b:块设备文件
  • c:字符设备文件按
  • p:管道文件
  • s:套接字文件
[root@localhost ~]# find /home -type d
/home
/home/Kamin

组合查找:

与:-a,默认的组合逻辑
或:-o
非:-not,!

根据文件的大小查找:

对于一个大小为1500byte大小的文件,其文件大小大于1K、小于2K。在Linux中以K为单位进行查看时,显示它的大小为2K。Linux系统在无法准确显示文件大小时,趋向于使用费一个大一点的值来表示。

当find命令根据文件大小进行查找时,便是以这个偏大一点的值来为标准进行查找的。举例说,当我们查找一个2K的文件时,系统将查找范围内找出大于1K,小于等于2K的文件。

-size [+|-]#UNIT(UNIT可为k, M, G):

  • -#UNIT:文件大小范围为 (#-1, #];
  • -#UNIT:文件大小范围为 [0, #-1];
  • +#UNIT:文件大小范围为 (#, ∞];

查找/etc目录下大小约为(1,2]k的文件:

[root@localhost ~]# find /etc -size 2k -ls |head 
135032790    4 -rw-r--r--   1 root     root         1982 6月 10  2014 /etc/vimrc
134320287    4 -rw-r--r--   1 root     root         1518 6月  7  2013 /etc/aliases
134320289    4 -rw-r--r--   1 root     root         1602 6月  7  2013 /etc/csh.cshrc

根据时间戳查找:

以“天”为单位进行查找;

  • -atime [+|-]#:
    • #: [#,#+1)
    • +#: [#+1,∞]
    • -#: [0,#)
  • -mtime
  • -ctime

与根据文件大小查找类似,-atime 2表示查找48小时至72小时范围内访问过的文件;-atime -2表示查找48小时内访问过的文件;-atime +2表示查找最近访问时间超过72小时的文件。

以“分钟”为单位:
-amin
-mmin
-cmin

以“分钟”为单位与以“天”为单位类似。

根据权限查找:

-perm [/|-]mode
mode:精确权限匹配;
/mode:任何一类用户(u, g, o)的任何一位权限(r, w, x)符合条件即满足;9位权限之间存在”或”关系。
-mode:每一类用户(u, g, o)的权限中的每一位(r, w, x)同时符合条件即满足;9位权限之间存在“与”关系。

处理动作:

-print:输出至标准输出,这是默认的动作;
-ls:类似于对查找到的文件执行 “ls -l” 命令,输出文件的详细信息;
-delete:删除查找到的文件;
-fls /PATN/TO/SOMEFILE:把查找到的所有文件的长格式信息保存至指定文件中;
-ok COMMAND {} \:对查找到的每个文件执行由COMMAND表示的命令;每次操作都由用户进行确认;
-exec COMMAND {} \:对查找到的每个文件执行由COMMAND表示的命令,不必与用户交互确认;

find在执行处理动作时,是将查找到的文件路径一次性送到处理动作命令的,而有些命令不支持过长的参数,会造成错误。使用find | xarg COMMAND可避免这种错误。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值