layout: post
title: 文件查找
date: 2017-11-26
tags: [“Linux”,”字符处理和文件查找”]
locate命令:
根据数据库/var/mlocate/mlocate.db进行模糊查找,搜索的是全路径,而不仅仅是文件名,该数据库是用来存放文件索引的,所以速度非常快,但是问题也来了,这个数据库并不是实时更新的,默认是每天更新一次,如果要手动更新数据库则需要执行updatedb命令来更新数据库。
locate -i Keyword 不区分大小写
locate -n Keyword 只举前几个匹配的项目
locate -r Keyword 正则表达式 例如:locate -r ‘(Doc\’Dow)‘ (注意,正则需要加引号,切是非扩展的正则)
find 命令:实时查找工具,通过遍历指定路径完成文件查找
工作特点:
• 查找速度略慢
• 精确查找
• 实时查找
• 可能只搜索用户具备读取和执行权限的目录
find [OPTION]… [查找路径] [查找条件] [处理动作]
- OPTIONS:
-maxdepth 查找的最大目录深度
-mindepth 查找的最小目录深度
-name 指定文件名查找(注意,是精准匹配,可以使用通配符[]{^}?*,不能使用正则表达式)
-iname 也是指定文件名,但是会忽略文件名的大小写
-inum 按inode号查找(一般用的不多)
-samefile 相同inode号的文件,即硬链接
-links n n表示连接的数量
-regex 正则表达式,匹配的是整个文件路径,而不仅仅是文件名!(非扩展的正则表达式)
-user username 指定用户的文件
-group groupname 指定组的文件
-uid 指定uid权限的文件
-gid 指定gid权限的文件
-nouser 查找没有属主的文件(比如说员工离职,账号已经删除了)
-nogroup 同nouser,不过这里指的是没有属组的文件
-type 查找指定文件类型的文件
f:普通文件
d:目录文件
l:链接文件
s:套接字文件
b:块设备文件
c:字符设备文件
p: 管道文件
-size 按文件大小来查找参数前不加[+’-]表示匹配参数-1到参数之间的大小
例如: find ./ -size 1m 表示查找当前目录下0-1m之间的文件
find ./ -size 2G 表示查找当前目录下1-2G文件大小的文件
参数前加[+’-]的
例如: find ./ -size +1m 表示匹配文件大小>1m不包括1m的文件
find ./ -size -1G 表示匹配文件大小<=1G的文件
注意三个表示方法的区间范围,混淆了可能会找不到你需要查找的文件
+1m: (1,+∞)
-1m: [0,1]
1: (0,1]
+2m: (2,+∞)
-2m: [0,2]
2: (1,2]
-ctime 创建时间
-mtime 修改时间
-atime x 访问时间(天为单位) [+’-]类似size ,不过 不加前缀符默认表示 [x,x+1)的范围
所以+x 就表示[x+1,+∞)的区间范围
-x 就表示[0,x)的区间范围-amin x 同atime,只不过单位换成了分钟
-cmin
-mmin
组合条件:
与:-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 ./ -size + 1M -mindepth=1 -maxdepth=3 这个命令,系统默认就会先筛选当前目录以及所有子目录、内的文件,筛选完后,再根据目录深度的参数来筛选已经匹配的文件。
所以,显而易见,正确的写法应该是这样:
find ./-mindepth=1 -maxdepth=3 -size + 1M 好吧,都说find智能,但其实他也偷懒不动脑子
注意:如果能用locate查到的文件,尽量用locate来查找,find消耗系统资源比较多,能避免使用find就尽量避免使用find,如果必须使用find,那么查找条件不要太模糊,尽量精确。