文件查找

find

帮助文档 Finding Files

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 常用
find [path] -name [filename] # 查找[path]下[filename]文件
find [path] -iname [filename] # 忽略大小写的查找
find [path] -maxdepth [num] -name [filename] # -maxdepth +数字为搜索的最大层数
find [path] -not -name [filename] # 查找不匹配的,同 find [path] ! -name [filename]
find [path] -name [filename1] -name [filename2] # 多条件查找
find [path] -type d -name [dirname] # 查找目录
find [path] -type d -empty # 查找空目录
find [path] -size [size] # 查找文件大小大于/大于/等于size的
# 进阶用法
find [path] -maxdepth [num] -maxdepth [num2] -name [filename] # 设置查找的最大深度和最小深度
find [path] -c[dimension] [num] # 查找符合条件修改时间的文件
find [path] -perm [permision] # 查找文件中符合权限的文件
find [path] [...] -exec [bash instruction] {} \; # 对查找出的符合条件的文件进行批处理操作
# tips
find [path] [...] |wc -l # 查看有多少条记录

详细说明

1
2
# 查找[path]下[filename]文件
find [path] -name [filename]

[path]可以是相对路径可以是绝对路径,也可以是多条路径,[filename]是完全匹配,不是包含子字符串就能匹配成功的,可以使用通配符*,如果命令较为简单,[filename]可以不用加表示字符串的双引号,参数过多会出现识别不了的问题,此时要加上双引号。

最大深度设为1的话还可以使用ls+grepls /etc | grep conf,除了maxdepth,还有mindepth,用法一样,如果要查找第n层的结果,让最大深度和最小深度的值一样即可

1
2
# -maxdepth +数字为搜索的最大层数
find [path] -maxdapth [num] -name [filename]

1
2
# 查找目录
find [path] -type d -name [dirname]

如果一个路径的几层都能和[dirname]匹配,那这几层都会在结果中分条显示出来

type后能接的类型:

  • f 普通文件
  • d 目录
  • l 符号连接
  • b 块设备
  • s 套接字

匹配多种类型的话用逗号隔开

1
2
# 多条件查找
find [path] -name [filename1] -name [filename2]

两个-name之间什么都不加,默认是AND与操作,如果用OR或操作,加上-o

1
2
# 查找文件大小大于/大于/等于size的
find [path] -size [size]

[size]前不带符号(没有“=”号)如果文件使用[size]个单位的空间(向上取整),则为true,数字前加上“+”号,表示如果文件使用至少n个存储单元,“-”号表示文件使用少于n个存储单元

[size]数字后不带字母,默认是512字节块,后面可以带上如下单位(区分大小写):

  • b(小写),512字节

  • c(小写),1字节

  • w(小写),2字节

  • k(小写),KB

  • M(大写),MB

  • G(大写),GB

1
2
# 查找文件中符合权限的文件
find [path] -perm [permision]

linux中权限表示有两种,一种是用数字表示,读权限是4,写是2,执行是1,具有哪个权限加起来就行,比如读写可执行是7,读写是6,读可执行是5。而linux针对不同的用户(user,group,others)又分别赋予权限,所以会看到三个数字,比如777,664等。

另一种是用字母表示,ugo分别代表user,group,others,a则代表所有人。rwx代表读、写、可执行。

在表示权限的字母/数字前如果什么都不加就是精确匹配,而加上短横线-代表含有表示的权限就能匹配,而/代表三个用户中有一个满足即可(无权限除外)

做一个简单的小实验,先用bash生成不同权限的文件,忽略others,生成权限不同的16个文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
for i in {1..16}
do
touch "$i.txt"
chmod 000 "$i.txt"
done
pm=(0 4 2 6)
for i in {0..3}
do
for j in {0..3}
do
name = `expr $i \* 4 + $j + 1`
chmod "${pm[i]}${pm[j]}" "${name}.txt"
done
done

依次执行下面三条命令,为了看的更清楚,使用了-exec,将find的结果用ls -l显示出来,这里的[path]没有用.或者./,是因为会find到.这个目录本身,而目录能正常访问,至少要具有500的权限,所以采用了./*的写法。结果已经很清晰明了了。

1
2
3
find ./* -perm 420 -exec ls -l {} \;
find ./* -perm -420 -exec ls -l {} \;
find ./* -perm /420 -exec ls -l {} \;