一、locate命令

1. 查找机制

通过事先创建的索引查找,做模糊匹配。数据库可以定时更新或手动更新。缺点为找到的文件可能不准确,因为索引库完成索引后创建的文件不再索引库中

2. 命令使用格式

locate [option] pattern

  • option:
    -b:仅查询文件名可匹配的内容
    -c:仅显示有多少个符合条件的文件,不会显示查找到的文件
    -r:如果想使用正则表达式,需要结合-r选项
  • 更新数据库命令:updatedb,索引构建需要遍历整个文件系统,这个操作特别消耗资源

3. 工作特性

  • 查找速度快
  • 模糊查找:根据给定关键字进行查找,路径中包含关键字的文件也会被显示
  • 非实时查找:构建完数据库后新生成的文件都不会被查找到

二、find命令

1. 介绍

不需要实现创建数据库,而是通过实时遍历,但遍历整个文件系统需要消耗的系统资源与时间都很大,所以在查找是一定要多加一些限制条件,如查找范围、文件大小区间、创建日期、属主、属组

2. 命令格式:

find [option] [查找路径] [查找条件] [处理动作]

[option]:
[查找路径]:指定一个路径作为查找的起路径,默认为当前目录,如果不给的话,会把当前目录的所有文件都显示出来。
[查找条件]:限定被查找文件的特性
1. -name "pattern":通过文件名查找,支持glob
2. -iname "pattern":同-name,但不区分文件的大小写,支持glob
3. -regex "pattern":可用正则表达式查找文件,但此处查找会包含文件路径,类似locate的查找方式
4. -user USERNAME:根据文件的属主查找
5. -group GROUPNAME:根据属组查找
6. -uid #:通过uid查找某个文件
7. -nouser:查找孤儿文件
8. -type TYPE
f:普通文件
d:目录文件
l:符号链接文件
b:块设备文件
c:字符设备文件
p:管道文件
s:套接字文件
9. -size [+|-]#UNIT:给上一个数字跟上单位,假设查询条件为5k
不带+、-:表示从(5-1k,5k],表示从大于给定数字减1(不包含)至给定数字的区间查找
-#UNIT:表示(0,#-1k],表示从0k至小于给定数字减1k(包含)
+#UNIT:表示(#,∞),表示从给定数(不包含)字到无穷大
10. -atime [+|-]#:
#:距现在小于#天,但不到#+1天的文件,[#,#+1 )
-#:表示#天内访问的文件(0,#)
+#:表示[#+1,∞),大于#+1天没有访问过
11. -mtime:
12. -ctime
13. -amin
14. -mmin
15. -cmin:
16. -perm [/|-]mode
(1)mode:精确权限查找,查找的文件必须精确匹配给定权限
(2)/mode:任何一类权限只要能包含任何一位给定的权限即为匹配,如给定搜索条件为222权限,文件中任何权限位只要包含读即满足
再则,如果给定搜索条件为600,表示只要文件属主权限中带有读或者写即为匹配,0表示该位权限不做考虑
(3)-mode:表示文件的权限必须包含给定的权限才能被匹配到
[处理动作]:对匹配到的文件做出的动作,如删除、复制,默认为输出至屏幕
1. -print:默认动作
2. -ls:输出文件的长格式信息
3. -delete:删除查找到的文件
4. -fls /PATH:把查找的文件信息保存到指定路径中
5. -ok COMMAND {} \; :查找到的文件执行命令
6. -exec COMMAND {} \; :同ok
注:find查找到文件是一次性传给后面的命令,有些命令不能接受太多的参数,会出现异常

三、 练习

  1. 找出/tmp目录下属主为非root的文件;
    ~]# find /tmp -not -user root -ls

  2. 找出/tmp目录下文件名中不包含fstab字符串的文件。
    ~]# find /tmp -not -name *fstab* -ls

  3. 找出/tmp目录下属主为非root,而且文件名不包含fstab的文件。
    ~]# find /tmp -not \( -user root -o -iname "*fstab*" \) -ls

  4. 查找var目录下属主为root,属组为mail的所有文件或目录;
    ~]# find /var -user root -group mail -ls

  5. 查找/usr目录下,不属于root、bin、hadoop的所有文件或目录。
    ~]# find /usr -not \( -user root -o -user bin -o -user hadoop \) -ls
    ~]# find /usr \( -not -user root -not -user hadoop -not -user bin \) -ls

  6. 查找/etc目录下最近一周内其内容修改过且属主不是root的也不是hadoop的文件或目录
    ~]# find /etc -mtime -7 -not \( -user root -o -user hadoop \) -ls

  7. 查找当前系统上没有属主或属组,且最近一周内曾被访问过的文件或目录;
    ~]# find / \( -nouser -o -nogroup \) -atime -7 -ls

  8. 查找/etc目录下大于1M且类型为普通文件的所有文件。
    ~]# find /etc -size +1M -type f -ls

  9. 查找/etc目录下所有用户都没有写权限的文件。
    ~]# find /etc -not -perm /222 -ls

  10. 查找/etc目录至少有一类用户没有执行权限的文件。
    ~]# find /etc -not -perm -111 -ls

  11. 查找/etc/init.d目录下,所有用户都有执行权限,且其他用户有写权限的文件。
    ~]# find /etc/init.d/ -perm -111 -perm -002 -type f -ls
    ~]# find /etc/init.d/ -perm -113 -type f -ls