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
可避免这种错误。