您的位置:首页 > 其它

文件查找工具:locate和find

2017-03-29 23:25 369 查看

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
可避免这种错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: