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]… [查找路径] [查找条件] [处理动作]

  1. 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)的区间范围

  2. -amin    x atime,只不过单位换成了分钟
  3. -cmin
  4. -mmin 
  5. 组合条件:
    与:-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,那么查找条件不要太模糊,尽量精确。

 

文档更新时间: 2018-12-13 17:48   作者:张尚