文章目录

  • 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