文件查找命令之locate,find,locatefind


文件查找
在文件系统上查找符合条件的文件
文件查找命令:
locate:非实时查找( 数据库查找)
find:实时查找

locate:
查询系统上预建的文件索引数据库
/var/lib/mlocate/mlocate.db

依赖于事先构建的索引
索引的构建是在系统较为空闲时自动进行( 周期性 任务),管理员 手动更新数据库(updatedb)

索引构建过程需要遍历整个根文件系统,极消耗资源
工作特点:
• 查找速度快
• 模糊查找
• 非实时查找
• 搜索的是文件的全路径,不仅仅是文件名
• 可能只搜索用户具备读取和执行权限的目录
locate 命令
locate KEYWORD

-i:执行不区分大小写的搜索

-n N:只列举前N 个匹配项目

-b:只匹配路径中的基名

-c:只显示统计多少个符合条件的路径

-r:能基于基本正则表达式来编写命令

locate foo
• 搜索名称或路径中带有“foo ”的文件
locate -r ‘.foo$’
• 使用Regex 来搜索以“.foo ”结尾的文件

find
实时查找工具,通过遍历指定路径完成文件查找;
工作特点:
• 查找速度略慢
• 精确查找
• 实时查找
• 可能只搜索用户具备读取和执行权限的目录
用法:
find [OPTION]... [ 查找路径] [ 查找条件] [ 处理动作]

查找路径:
指定具体目标路径,默认为当前目录
查找条件:
指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
处理动作:
对符合条件的文件做操作,默认输出至屏幕

查找条件
表达式:选项和测试
根据文件名和inode 查找:
-name " 文件名称":支持使用glob *, ?, [], [^]

-iname " 文件名称":不区分字母大小写

-inum n:按inode 号查找

-samefile name:相同inode 号的文件

-links n:链接数为n 的文件

-regex "PATTERN":以PATTERN(正则表达式)匹配整个文件路径字符串,而不仅仅是文件名称ID

根据属主、属组查找:
-user USERNAME:查找属主为指定用户(UID) 的文件

-group GRPNAME:查找属组为指定组(GID) 的文件

-uid UserID:查找属主为指定的UID 号的文件

-gid GroupID:查找属组为指定的GID 号的文件

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

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

根据文件类型查找:
-type TYPE
f:普通文件

d:目录文件

l:符号链接文件

s:套接字文件

b:块设备文件

c:字符设备文件

p:管道文件

组合条件:
与:-a

或:-o

非:-not !

德· 摩根 定律:
(非 A) 或 (非 B) = 非(A 且 B)
(非 A) 且 (非 B) = 非(A 或 B)
示例:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
find 示例
find -name snow.png
搜索名为snow.png 的文件

find -iname A.png
不分大小写查找名为A.png 、a.png、 A.PNG 等等的文件
find / -name “.txt”
查找根目录下后缀名为txt的文件
find /var –name "
log*"
查找var目录下包含log的文件
find -user test -group test
搜索被用户test 以及组群test所拥有的文件

其它示例:
find -user test -not -group test
find -user test -o -user test
find -not ( -user test -o -user test )
find / -user test -o -uid 500

找出/tmp 目录下,属主不是root ,且 文件名 不以f 开头的 文件
find /tmp ( -not -user root -a -not -name 'f' ) -ls
find /tmp -not ( -user root -o -name 'f
' ) –ls

排除目录
示例:查找/etc/ 下,除/etc/sane.d 目录的其它所有.conf 后缀的文件
find /etc -path ‘/etc/sane.d’ -a -prune -o -name “*.conf” -print

根据文件大小来查找:
-size [+,-]#unit
常用单位:k, M, G

如:6k 表示(5k,6k]
-#unit :[0到#-1]
如:-6k 表示[0到5k]
+#unit :(#和大于#)
如:+6k 表示(6k或大于6k )

根据时间戳
以天为单位(time):
-atime [+|-]# 访问时间

+#:表示(#+1)天之外被访问

-#:表示#天内被访问过的

#:表示小于(#+1)大于或者#天的时间段被访问过

-ctime:改变时间
-mtime:修改时间
以分钟为单位(min)
-amin
-mmin
-cmin

根据权限查找:
-perm [+|-]MODE

MODE:精确匹配

+MODE:任何一类用户的任何一位权限匹配即可,常用于查找某类用用户的某特定权限是否存在

-MODE:每类用户的指定要检查的权限位都匹配

示例:
find -perm 755,会匹配权限模式恰好是755 的文件
只要当任意人有写权限时,find -perm +222 就会匹配
只有当每个人都有写权限时,find -perm -222 才会匹配
只有当其它人(other )有写权限时,find -perm -002才会匹配

处理动作:

-print:默认,打印在标准输出上

-ls:以长格式输出各文件信息,类似于ls -l

-delete:删除查找到的文件

-fls file:查找到的所有文件的长格式信息保存至指定文件中

-exec COMMAND {} ;:对查找到的文件指定的命令

-ok COMMAND {} ;:交互式,对查找到的每个文件执行由COMMAND 指定的命令

find |xargs COMMAND: find把查找到的所有文件一次性地传递给-exec执行

{}:用于引用查找到的文件名称自身

参数代换:xargs
用于产生某个命令的参数 xargs 入可以读入stdin的数据,并且以空格符或回车符将stdin的数据分隔成为arguments

注意:文件名或者是其他意义的名词内含有空格符的情况

有些命令不能接受过多参数 ,命令执行可能会失败,xargs可以解决
示例:
find | xargs COMMAND
find /sbin -perm +7000 | xargs ls -l

示例:
find -name “*.conf” -exec cp {} {}.orig ;
备份配置文件,添加.orig 这个扩展名

find /tmp -ctime +3 -user joe -ok rm {} ;
提示删除存在时间超过3天以上的joe 的临时文件

find ~ -perm -002 -exec chmod o-w {} ;
在你的主目录中寻找可被其它用户写入的文件

find /data –type f -perm 644 -name “*.sh” –exec chmod 755 {} ;

find /home –type d -ls

相关内容