linux上可以在文件系统上在指定的路径查找需要的文件,可以使用的文件查找命令有: locate , find
locate 是非实时查找,也叫数据库查找, 它基于索引进行的查找,基于数据库的查找,依赖于已经构建的索, linux索引实在系统空闲时自动进行的,是一个周期性的任务。如果要使用locate来做精确查找,需要先手动构建数据库索引。在系统生产运行时,构建数据库索引比较费资源。 特点如下:
(!) 查找速度快
(2) 可以模块查找
(3) 非实时查找
使用: locate 查找关键字
find 实时查找。它通过便利目标目录下的所有文件来匹配目标文件,不依赖与其他外部环境。 特点如下:
(1) 较locate 慢
(2) 可以精确查找
(4) 实时查找
find 命令使用
语法:
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression] [action]
说明:
path... 查找路径,可以指定多个,默认为当前路径
expression 查找的条件,包括根据文件名、类型、大小、修改时间等进行查找,默认查找当前路径所有文件
action: 处理动作,对符合条件的文件所做的操作,默认为显示到标准输出
查找条件:
-name 根据文件名查找, 支持glob,即包括: *,?,[],[^],来匹配文件名
-例如:
find /etc/ -name passwd 精确查找
find /etc/ -name '*passwd*' 匹配查找
-iname 根据文件名查找,不区分大小写
-regex pattern 使用正则表达式来匹配文件(路径)
根据属主属组查找:
-user username 查找属主为username的文件
例如:
find /home -user ansible -ls
ls是对找到的文件查看长格式
-group groupname 查找属组为groupname的文件
-uid uidnumber 查找uid为uidnumber的文件
-gid gidnumber 查找gid为gidnumber的文件
-nouser 查找没有属主的文件
-nogroup 查找没有属组的文件
根据文件类型查找:
-type type
f 普通文件
d 目录
l 链接
b 块设备
s 套接字
c 字符设备
p 管道文件
注意: 如果没有限制文件类型,那么默认显示所有的文件类型
根据文件大小查找
查找单位: k M G
-size size 查找(size-1, size] 之间的大小的文件
-size -size 查找[0, size-1] 之间的大小的文件
-size +size 查找[size, 无穷大] 之间的大小的文件
例如;
根据时间戳进行查找
以天为单位
-atime +/- 时间 [t,t+1)/+[t+1, 无穷大]/-[0,t)
-ctime +/- 时间 [t,t+1)/+[t+1, 无穷大]/-[0,t)
-mtime +/- 时间 [t,t+1)/+[t+1, 无穷大]/-[0,t)以分钟为单位
-amin +/- 时间
-cmin +/- 时间
-mmin +/- 时间
根据权限查找:
-perm +/- mode
-perm mode 根据权限精确查找
-perm +mode u|g|o对象中任何一类匹配即可
-perm -mode 每一类对象都必须拥有(包含)为其指定的权限标准
说明: + 相当于或关系(其中一个符合) - 相当于且关系(所有用户都要符合)
注意: + 在c6版本上要用/替代, +被废弃
查找条件组合:
-a 与
-o 或
-not 非
例如:
find / ( -nouser -o -nogroup ) -ls
find /home ( -not -user root -a -not -user root ) -ls
find /home -not ( -user root -o -user root ) -ls
处理行为
-print 默认的处理方式,显示结果到标准输出
-ls 长格式显示
-deete 删除查找到的文件
-fls /path/to/path 查找到的所有文件的长格式信息保存至指定文件中
-ok command {} ; 对每个查找到的文件执行command指定的命令 ,执行命令之前会让用户确认。
-exec command {} ; 指定命令不需要用户确认
说明: {} 表示引用被查找到的文件;
注意: find 一次性查找到所有的符合条件文件然后在传递给后面的命令。这种方式可能会导致处理失败。可以通过xargs command 来执行命令。
示例:
查找属主的文件改为root
find /tmp -nouser -exec chown root {} ;
find /home -perm -700 -exec cat {} ;
find /tmp -name a.txt -ok du {} ;
查找5分钟之内改过的文件:
find /tmp -cmin -5
修改文件名称:
find /tmp -name a.txt -exec mv {} {}.csv ;
find 命令使用示例
查找/var目录下属主为root, 且属组为mail的所有文件或目录
find /var -user root -a -group mail -ls查找/user目录下不属于root、bin和hadoop的所有文件或目录
find /usr -not ( -user root -o -user bin -o -user hadoop ) -ls查找/home目录下最近一周内其内容修改过的同时属主不为root 也不是hadoop的文件或目录
find /home -atime -7 -a -not ( -user root -o -user hadoop ) -ls查找当前系统上没有属主或属组,且最近一周内曾经被访问过的文件或是目录
find / -nouser -a nogroup -a atime -7查找/etc目录下大于1m且类型为普通文件的的所有文件或目录
find /etc -not -perm /222查找/etc下至少有一类用户没有执行权限的文件
find /etc -not -perm -222 -ls查找/etc目录下所有用户都没有写权限的文件
find /etc -not -perm /222 -ls查找/etc/init.d目录下,所有用户都由执行权限,且其他用户有写权限的文件.
find /etc/init.d -perm -113