Linux系统「文件查找」
Linux系统文件中常用属性为以下内容:名称,大小,权限,属主,属组,修改时间,访问时间等,在庞大的系统中,需要在prompt中查询文件,需要借助其查找工具实现,以此可以查询相同或要求指定属性的文件,Centos及EHLE类系统实现查询工具有:Locate、find工具。
locate工具
`locate`
synopsis: locate [option]…PATTERN….
options:
-b --basename: 只匹配路径的基名
-c --count: 统计匹配条件的数量
-r --regexp:支持正则表达式方式查询
locate工作特性:
优点####
- 查询速度快,基于索引表查询,索引表时系统计划或手动使用updatedb命令建立
- 不占用系统资源
缺点####
- 非实时查询
- 模糊查询
- 查询的名称匹配路径名称
- 索引表建立非常耗用系统资源
find工具
一、工作特点
优点###
- 实时查找
- 准确查找,遍历整个目录下的所有文件
- 可以对查询到的文件进行指定动作,即查看,删除,移动等操作.
缺点####
- 查询速度略慢
find命令使用方法
`find` - search for files in a directory hierarhy
sysnopsis: find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
查询条件
查询条件由选项及测试条件组成:
【 测试条件 】
一、以文件名查找
-
-name pattern
: 以文件名查找 -
-iname pattern
: 不区分文件名的大小写,只支持glob风格的查找方式:*,?,[],[^] -
-regex pattern
: 基于正则表达式查找文件,精确匹配文件名
二、以文件从属关系查找
-
-user USERNAME
: 以用户名查找 -
-group GROUPNAME
: 以组名查找 -
-uid UID
:以UID号查找 -
-gid GID
:以GID查找 -
-nouser
: 查找没有属主的文件 -
-nogroup
: 查找没有属组的文件
三、以文件类型查找
-
-type TYPE
: 以文件类型查找-
f
: 普通文件 -
d
: 目录文件 -
b
: 块设备文件 -
c
: 字符设备文件 -
l
: 连接文件 -
s
: 套接字文件 -
p
: 管道文件
-
四、根据文件大小查找
-
-size [+|-]SIZE
: 以文件大小查询,大小包含K,M,G的单位-
-size 5M
: 精确查找大小为5M的文件,大小上面浮动稍微有偏差 -
-size -5M
: 查询大小小于5M的文件 -
-size +5M
: 查询大小大于5M的文件
-
五、根据时间查找
-atime [+|-]TIME
: 以访问时间(天)查找-mtime [+|-]TIME
: 以数据修改时间(天)查找-ctime [+|-]TIME
: 以元数据修改时间(天)查找-amin [+|-]TIME
: 以访问时间(分钟)查找-mmin [+|-]TIME
: 以数据修改时间(分钟)查找-cmin [+|-]TIME
: 以元数据修改时间(分钟)查找-
-newer FILE
: 以FILE文件为条件,判断比它新的文件-
7
: 准确时间,7表示刚好7(天|分钟)起始位置 -
+7
: 7(天|分钟)以前的 -
-7
: 7(天|分钟)以内的
-
六、根据权限查找
-
-perm MODE
: 精确权限查找find . -perm 644
-
-perm /MODE
: 任何一类用户(u,g,o)中的任何一位(r,w,x)符合条件即满足,理解为或关系-
find . -perm /222
: 查找至少有一个类用户有写权限 -
find . -perm /666
: 查找至少有一个类用户有读写权限 -
find . -perm /001
:查找其他用户有执行权限
-
-
-perm -MODE
: 每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足,理解为与关系-
find . -perm -222
: 查找三类用户都有写权限 -
find . -not -perm -222
:至少有一类用户没有写权限
-
七、 组合条件测试
-
与
:-a
- 默认组合逻辑,可以加
-a
,也可以取消,例:find . -type f -a -user mariadb
,两个条件同时满足
- 默认组合逻辑,可以加
-
或
:-o
- 可以加
-o
参数,例:find . -type f -o -nouser
,两个条件只满足一个即可
- 可以加
-
非
:-not
或者!
表示-
find . -not -type f
,不是普通文件 -
find . ! -type f
,同上
-
八、处理动作
-
-print
: 默认为打印,不需要添加,输出入屏幕 -
-ls
: 以ls长文件的格式形式输出 -
-delete
: 删除查找到的文件 -
-fls /PATH/TO/SOMEFILE
:把查询到的文件以ls详细信息格式保存到SOMEFILE文件中 -
-ok COMMAND {} \;
: 查找到的文件传递给COMMAND命令,提每步都给用户提示确认操作 -
-exec COMMAND {} \;
: 查找到的文件传递给COMMAND命令,直接修改完成,不给用户确认
注意:find将查找到的文件路径一次性传递给后面的命令,但有很多的命令不能接受过长的参数,导致命令的执行失败,使用如下方式可避免此错误的发生:
find /etc -type f | xargs -i COMMAND
: -i参数是由find的结果传给xargs命令后,由-i指定结果代替符
find /etc -type f | xargs -i cp {} /tmp : -i 指定代替符为{}
选项
一、指定查找目录范围
-
-maxdepth NUM
: 指定最多搜索目录层级到NUM层 -
-mindepth NUM
: 指定最少搜索目录NUM层级
二、查找空文件
-
-empty
: 查询内容为空的文件-
find ./ -empty
: 查找当前目录下的所有空文件
-
三、排除符号连接
-
-follow
: 排除符号连接
Find与xagrs的命令结合
Usage:
find /etc -type f | xargs -i cp {} /tmp/
-i : 由xargs接收的参数,由-i声名由后一个命令{}代替
==============
示例
- 找出/tmp目录下属主为非root,且文件名包含fstab字符串的文件
find /tmp -not -user root -a -name *fstab*
- 找出/tmp目录下文件名中不包含fstab字符串的文件
find /tmp -not -name *fstab*
- 找出/tmp目录下属主为非root,而且文件名不包含fstab字符串的文件
find /tmp -not -user root -a -not -name *fstab*
find /tmp -not \(-user root -o -name *fstab*\)
- 至少有一周没有访问过的文件
find /etc -atime +7 -ls
- 24小时内修改过的文件
find /etc -mtime -1 -ls
- 查找 /var目录下属主为root,且属组为mail的所有文件或目录
find /var/ -user root -group mail
- 查找/usr目录下不属于root,bin,或者hadoop的所有文件或目录,用两种方法
find ./ -not -user bin -not -user user3 -not -user user4
find ./ -not \( -user bin -o -user user3 -o -user user4 \)
- 查找/etc目录下最近一周其内容修改过, 且属主不是root用户也不是hadoop用户的文件或目录
find /etc -mtime -7 -not -user root -not -user hadoop
- 查找当前系统上没有属主或属组,且最近一周内曾被访问过的文件或目录
find / -atime -7 -nouser -o -nogroup
- 查找/etc目录下大于1M且类型为普通文件的所有文件
find /etc/ -size +1M -type f -ls
- 查找/etc目录下所有用户都没有写权限的文件
find /etc/ -type f -not -perm /222 -ls
- 查找/etc目录至少有一类用户没有执行权限的文件
find /etc/ -not -perm -111 -ls
- 查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的所有文件
find /etc/ -perm -111 -perm -002
find /etc/ -perm -113
摩根定律:
** !A -a !B = !(A -o B)**
** !A -o !B = !(A -a B)**