文章目录
- linux实现文件的查找的方式
- 1、locate命令
- 2、find命令
- find命令的格式
- 路径
- 匹配模式
- 1)根据文件名查找
- 2)根据文件属主的名字或者uid进行查找
- 3)根据文件属组的名字或者gid进行查找
- 4)查找没有属主的文件
- 5)查找没有属组的文件
- 6)根据文件的类型进行查找
- 7)根据文件的大小进行查找
- 8)组合条件查找
- 9)根据文件的时间戳(天)进行查找
- 10)根据文件的时间戳(分)进行查找
- 11)根据文件的权限进行查找
- 12)使用正则进行匹配
- 动作
- 补充
- find之ctime、atime、mtime详解
- 结合find清空文件
linux实现文件的查找的方式
1、locate命令
原理;
在linux中,每天的12:00会将系统中的全部的文件名和文件的路径记录到数据库中
在查找文件的时候,会直接扫描数据库,来找文件的位置
缺点:
准确度不足
功能单一
优点:
查找速度非常快
2、find命令
原理:
在linux中逐一比对文件,检查是否是要匹配的文件
优点:
非常精确
功能强大
缺点:
慢
find命令的格式
find [路径] [匹配模式] [动作]
路径
/ 表示整个文件系统(整个计算机中查找)
./ 表示在当前目录下进行查找(也会查找当前位置下的子目录中的文件)
/path/to/dir 表示查找指定目录和目录中的子目录的中文件
匹配模式
1)根据文件名查找
-name 文件名 >>> 文件名严格区分大小写
-iname 文件名 >>> 文件名忽略大小写
例子:在文件系统中找出文件a.txt
# find / -name a.txt
例子:在/home和/home的子目录中找出文件名中包含字母a的文件
# find /home -name *a*
例子:在/home和/home的子目录中找出文件名中以字母a结尾的文件
# find /home -name *a
例子:在/home和/home的子目录中找出文件名中以字母a开头的文件
# find /home -name a*
例子:在当前位置下找出文件的第二个字母是a的文件
# find ./ -name "?a*"
例子:在当前位置下找出文件的第一个字母是a,倒数第三个字母是b的文件
# find ./ -name "a*b??"
注意
文件名可以是一个具体的名称,也可以是通配符
*:表示任意长度的任意字符
?:表示一位长度的任意字符
2)根据文件属主的名字或者uid进行查找
-user 用户名
-uid UID
【如果用户被删除,查找用户遗留下来的文件,只能用uid进行查找】
例子:在home下查找属主为laowantong的文件
# find /home/ -user "laowantong"
例子::在home下查找属主id为780的文件
# find /home/ -uid "780"
3)根据文件属组的名字或者gid进行查找
-group 属组名
-gid GID
4)查找没有属主的文件
-nouser
例子:在系统中找出没有属主的文件
# find / -nouser
5)查找没有属组的文件
-nogroup
例子:在文件系统中找出没有属组的文件
# find / -nogroup
6)根据文件的类型进行查找
-type 文件类型
文件的类型
d 目录
f 普通文件
s 链接文件
b 块设备问价【硬盘】
c 字符设备文件【键盘】
p 管道文件
l 链接文件
例子:在/home下找文件类型为目录的文件
# find /home/ -type d
例子:在根下找文件类型一般文件的文件
# find /home/ -type f
7)根据文件的大小进行查找
-size 大小值
说明:
如果省略单位,则默认单位是字节
+表示大于指定值的文件
-小于指定值得文件
例子:在home下找出文件大小为1K的文件
# find /home -size 1K
说明:
会将文件大小是0.xK~1K的文件都找出来
例子:在home下找出文件大小为3K的文件
# find /home -size 3k
说明:
会将文件大小是2k~3K的文件都找出来
例子:在home下找出文件大小为1M的文件
# find /home -size 1M
说明:
会将文件大小是0.xM~1M的文件都找出来
例子:在home下找出文件大小为3M的文件
# find /home -size 3M
说明:
会将文件大小是2.xM~3M的文件都找出来
例子:在home下找出文件大小为1G的文件
# find /home -size 1G
说明:
会将文件大小是0.xG~1G的文件都找出来
例子:在/home下找出文件大小小于35K的文件
# find /home/* -size "-35k
8)组合条件查找
-a: 且 and &&
-o: 或 or ||
-not: 非 !
例子:从home下,找出文件的类型不是目录的文件
# find /home -not -type d
例子:从home下,找出文件的类型不是目录的文件
# find /home -not -type d -a -not -type s
or
# find /home -not \( -type d -o -type s \)【find 的() 需要转义】
例子:从home下找出文件类型是一般文件,且文件名包含字母a,而且文件大小大于1K
# find /home -type f -a -name "*a*" -a -size "+1K"
9)根据文件的时间戳(天)进行查找
-mtime [+|-]n(单位:天) 最近一次的内容修改时间
-ctime [+|-]n(单位:天) 最近一次的属性修改时间
-atime [+|-]n(单位:天) 最近一次的访问时间
说明:
1. 无符号:指定一个具体的那一天
2. + 号:指定时间之前的所有时间
3. - 号:指定之间到当前时间这段时间内
10)根据文件的时间戳(分)进行查找
-cmin [+|-] n (单位:分)
-amin [+|-] n (单位:分)
-mmin [+|-] n (单位:分)
例子:在根下,找出5分钟之内访问过的文件
# find / -atime -5
例子:在根下。找出5分钟内没有访问过的文件
# find / -atime +5
11)根据文件的权限进行查找
方式1:-perm 权限(精确查找)
方式2:-perm /权限(模糊查找) 9位权限中,只要有一位匹配成功,就可以
方式3:-perm -权限(模糊查找) 文件的权限必须包含指定的9个权限位
例子:在根下,找出权限为700的文件
# find / -perm 700
例子:在根下,找出文件权限属主有任意权限的文件
# find / -perm /700
例子:在跟下,找出文件权限属主有写权限、执行权限至少一个权限文件
# find / -perm /300
例子:在根下,找出文件至少一类用户有写权限的文件
# find / -perm /222
例子:在根下,找出所有用户都执行权限的文件
#find / -perm 111
12)使用正则进行匹配
find -regex "PATTERN"【pattern匹配整个文件路径字符串,而不仅仅是文件的名称】
动作
{} ——代表找到的文件
\ —— 代表转义
- -print 打印输出查找到的文件列表(默认)
- -delete 删除匹配到的行
- -quit 查找到一个就退出
- -ls 将找到的文件以详细信息格式显示
- -exec 每找到一个文件执行一次(无交互)
- -ok 交互式的会询问
- xargs 将全部文件找到以后,统一进行替换,执行效率高
补充
find之ctime、atime、mtime详解
- modification time
当修改文件按的内容数据的时候,就会更新这个时间,而更改权限或者属性,mtime不会改变,这就是和ctime的区别 - status time
当修改文件的权限或者属性的时候,就会更新这个时间,ctime并不是create time,给我的感觉更像是change time,但这么说也不完全对,因为只有当更新文件的属性或者权限的时候才会更新这个时间,更改内容的话是不会更新这个时间的 - accesstime
当使用这个文件的时候就会更新这个时间
除非atime的时间早于mtime 和或者ctime,否则atime不会更新【relatime的概念】以上描述出自某篇博客,没有验证,等找时间验证
结合find清空文件
for i in `find -name "*.log"`; do cat /dev/null >$i; done
或
for i in `find /path/to/file -name "*.log"`; do echo "" >$i; done