Linux中的文件查找主要有locate 和 find两个命令, locate主要根据系统构建的索引后来查找,所以查找结果不一定是最新的, 一般用于模糊查找, 这里主要说下find命令
find命令特点: 实时查找,查找准确, 但是速度比基于索引的locate查找要慢点
格式:
find 查找路径 查找条件 处理动作
查找路径:默认是当前目录下, 系统会查找目录以及其子目录下的所有文件及目录
查找条件: 默认为指定目录下的所有文件
下面是一些常用的条件选项及解释
-name 文件名:文件名可用globbing字符, 注意不是正则
-iname 文件名: 不区分大小写, 其他同上面
-name 属主: 按属主查询
-group 属组: 按属组查询
-uid 属主id: 按uid查询
-gid 属组id: 按gid查询
-nouser: 没有属主的文件. 例如属组被删除了, 只有显示id
[root@centos test]# useradd user3 [root@centos test]# chown user3 c [root@centos test]# ll total 48 -rw-r--r--. 1 root root 23617 Sep 16 23:35 a -rw-r--r--. 1 user1 root 23057 Sep 16 23:36 b -rw-r--r--. 1 user3 root 0 Sep 16 23:14 c [root@centos test]# userdel user3 [root@centos test]# ll total 48 -rw-r--r--. 1 root root 23617 Sep 16 23:35 a -rw-r--r--. 1 user1 root 23057 Sep 16 23:36 b -rw-r--r--. 1 502 root 0 Sep 16 23:14 c [root@centos test]# find ./ -nouser ./c
-nogreoup: 查找没有属组的文件
组合的条件查找:
-a:与, 与和if的条件测试语句类似
-o: 或查找
-not 或 ! : 非查找
文件类型的查找
-type 参数
参数
f : 普通文件
d: 目录
l:链接文件
s: 套接字文件
b: 块设备
c: 字符设备
p: 管道设备
文件大小查找, 只能以整数为单位查找, 不能查找小数
常用单位: k, M, G, M和G一定要大写
-size [+|-]#单位
[root@centos test]# ll -h total 48K -rw-r--r--. 1 root root 24K Sep 16 23:35 a -rw-r--r--. 1 user1 root 23K Sep 16 23:36 b -rw-r--r--. 1 502 root 0 Sep 16 23:14 c [root@centos test]# find ./ -size 24k ./a #查找等于24k的文件 [root@centos test]# find ./ -size -24k ./ ./b ./c #查找小于24k文件 [root@centos test]# find ./ -size +23k ./a #查找大于23k文件
以时间戳查找
以天为单位:
-atime [+|-]# :最近一次的访问时间
例如
-atime 6: 查找6天(包括这个时间点)到第七天(不包括这个时间点)的所有访问的文件
[root@centos test]# stat {a,b,c} File: `a‘ Size: 23617 Blocks: 48 IO Block: 4096 regular file Device: fd00h/64768d Inode: 1317181 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2015-09-16 23:35:28.752283770 +1000 Modify: 2015-09-16 23:35:28.752283770 +1000 Change: 2015-09-16 23:35:28.752283770 +1000 File: `b‘ Size: 23057 Blocks: 48 IO Block: 4096 regular file Device: fd00h/64768d Inode: 1317180 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 500/ user1) Gid: ( 0/ root) Access: 2015-09-16 23:35:28.752283770 +1000 Modify: 2015-09-16 23:36:40.040119234 +1000 Change: 2015-09-16 23:36:40.042119251 +1000 File: `c‘ Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: fd00h/64768d Inode: 1317182 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 502/ UNKNOWN) Gid: ( 0/ root) Access: 2015-09-16 23:14:56.131835811 +1000 Modify: 2015-09-16 23:14:56.131835811 +1000 Change: 2015-09-17 10:19:44.575818713 +1000 [root@centos test]# find ./ -atime 0 ./ ./b ./c ./a #当前时间是2015-09-16 12:05pm, 可以见如果atime设为0, 并不是提供一个点时间, 而是一个范围, 指定时间>=查找时间>指定时间+1天
如果是+的结果, 不是多于指定时间, 而是>=(指定时间+1)
如果是-的结果, 就是小于指定时间一直到当前
如下图
-mtime:以修改时间查询, 其他同上
-ctime: 以改变时间查询, 其他同上
以分钟单位:
-amin, -mmin, -cmin功能同上
根据权限查找
-perm MODE:精确匹配
[root@centos test]# ll total 48 -rw-r--r--. 1 root root 23617 Sep 16 23:35 a -rw-r--r--. 1 user1 root 23057 Sep 16 23:36 b -rw-rw-r--. 1 502 root 0 Sep 16 23:14 c [root@centos test]# find -perm 664 ./c
-perm +MODE:查找的9为权限与文件的9为权限任何一位重叠, 就满足条件, 权限位之间是或的关系
[root@centos test]# ll
total 48
-rw-r--r--. 1 root root 23617 Sep 16 23:35 a
-rw-r--r--. 1 user1 root 23057 Sep 16 23:36 b
-rw-rw-r--. 1 502 root 0 Sep 16 23:14 c
[root@centos test]# find -perm +020
./c
#只有c文件有写权限
-perm -MODE:查找的9为权限必须要被文件的9为权限全部包含, 权限位之间是与的关系
[root@centos test]# find -perm -220 ./c #查找属主属组必须至少有写权限的文件
注意: 权限查找至于包含关系, 如要查找不被包含关系,需要用关系组合命令, 并且用摩尔定律.
例
[root@centos test]# find -not -perm +020 . ./b ./a #查找属组没有写权限的文件 [root@centos test]# ll total 48 -r--r--r--. 1 root root 23617 Sep 16 23:35 a -rw-r--r--. 1 user1 root 23057 Sep 16 23:36 b -rw-rw-r--. 1 502 root 0 Sep 16 23:14 c [root@centos test]# find -not -perm +222 ./a #查找每个用户都没有写权限的文件, 根据摩尔定律 -perm后边应是任何一个由可能有写权限或的关系.
处理动作
-print: 打到屏幕,默认
-ls 输出详细信息
-exec 命令 {} \; 这个是固定格式, 一行一行执行, 如果输入比较的的数据流, 则用命令 find | xargs 命令.
原文地址:http://jzrobbie.blog.51cto.com/6535329/1695633