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)

如果是-的结果, 就是小于指定时间一直到当前

如下图

wKioL1X6Jsqw7aEjAACh7-1DgjQ966.jpg

-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 命令.