本次博主来介绍下超实用的查找命令,没有查不到,只有做不到。
直接上干货:查找命令:locate和find,常用find,我们重点介绍find
locate
通过查询系统上预建的文件索引数据库全盘查找所需文件,locate是透过update程序将硬盘中的所有档案和目录资料先建立一个索引数据库,在执行loacte时直接找该索引,查询速度会较快,索引的构建是在系统较为空闲时自动进行(周期性任务),索引构建过程需要遍历整个根文件系统,极消耗资源。
索引数据库:/var/lib/mlocate/mlocate.db
管理员可以手动更新数据库(命令:updatedb),在内定值中,updatedb每天执行一次,可以修改crontab来更新设定值。(etc/crontab)
工作特点:
查找速度快
模糊查找
非实时查找
搜索的是文件的全路径,不仅仅是文件名
只搜索用户具备读取和执行权限的目录
接下来简单介绍几个常用选项
-i 不区分大小写的搜索
-n N 只列举前N 个匹配项目
-c –count 只显示搜索匹配到的个数
-r –regexp REGEXP搜索基本正则表达式 REGEXP 来代替模式
–regex模式是扩展正则表达式
示例:
[root@localhost ~]#locate -n 10 install #取全盘查询包含install字符的文件的前10个 [root@localhost ~]#locate -r "install$" #利用基本正则表达式取全盘中以install结尾的文件 [root@localhost ~]#locate -ir "install$" #不区分大小写利用基本正则表达式取全盘中以install结尾的文件 [root@localhost ~]#locate -icr "[0-9]\{1,\}\/install$" -----#利用基本正则表达式查询表统计匹配数 注意c加在r前面 [root@localhost ~]#locate -ic --regex "[0-9]{1,}/install$" -----#利用拓展正则表达式查询表统计匹配数
find
find命令是一个实时查找工具,通过遍历指定路径而完成对文件的查找;在使用该命令时,如果不选定参数,则在当前目录下查找子目录与文件并显示;另外,任何位于参数之前的字符串,都将视为欲查找的目录名。
工作特点:
查找速度略慢
精确查找
实时查找
可能只搜索用户具备读取和执行权限的目录
find语法:
find [OPTION]… [查找路径] [查找条件] [处理动作]
查找路径:指定具体目标路径,默认为当前目录
查找条件:指定的查找标准,可以是文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
处理动作:对符合条件的文件做操作,默认输出至屏幕
查找条件 :
1. 根据文件名和inode查找
2. 根据属主、属组查找
3. 根据文件类型查找
4. 根据逻辑组合条件查找
5. 根据文件大小来查找
6. 根据时间戳来查找
7. 根据权限来查找
根据文件名和inode查找:
-name “文件名称“: 支持使用glob,*, ?, [], [^]
-iname “文件名称“: 不区分字母大小写
-inum n: 按inode号查找
-somefile name: 相同的inode号文件
-links n: 链接数为n的文件
-regex 支持正则默认为(emacs标准)
-regextype egrep -regex
支持egrep同标准的正则支持更多表达式,比如:[[:digit:]][[:alpha:]]…….
示例:
[root@localhost ~]#find / -name insta #精确查找,系统中无此文件 [root@localhost ~]#find / -name insta?? /sys/fs/selinux/class/db_procedure/perms/install /sys/fs/selinux/class/x_colormap/perms/install /usr/bin/install #支持通配符查找 [root@localhost app]#ln passwd mima #通过设置硬链接,创建两个不同文件名的相同文件(inode) [root@localhost app]#find -samefile mima #查找相同inode号的文件 ./passwd ./mima [root@localhost app]#find -links 2 #查找链接数为2的文件 . ./passwd ./mima [root@localhost app]#
根据属主属组查找:
-user USERNAME: 查找属主为指定用户(UID)的文件
-group GROUPNAME: 查找属组为指定组(GID)的文件
-uid UserID: 查找属主为指定的UID号的文件
-gid GroupID: 查找属组为指定的GID号的文件
-nouser: 查找没有属主的文件
-nogroup: 查找没有属组的文件
示例:
[root@localhost etc]#find -user wangcai #查找属主为wangcai的文件 [root@localhost etc]#find -group wangcai #查找属组为wangcai的文件 [root@localhost etc]#find -nouser #查找没有属主的文件 [root@localhost etc]#find -nogroup #查找没有属主的文件
根据文件类型查找:
-type TYPE:
f: regular file普通文件
d: directory 目录文件
l: symbolic link符号链接文件
s:socket 套接字文件
b: block (buffered) special 块设备文件
c: character (unbuffered) special字符设备文件
p: named pipe (FIFO)管道文件
此处不做示例,格式为:find -type f
根据逻辑组合条件查找:
组合条件:
与:-a
或:-o
非:-not,
!
摩根定律:
(非P) 或(非Q) = 非(P且Q)
(非P) 且 (非Q) = 非(P或Q)
示例:
[root@localhost ~]#find /tmp \( -not -user root -a -not -name 'f*' \) #摩根定律找出/tmp目录下,属主不是root,且文件名不以f开头的文件 [root@localhost ~]#find /tmp -not \( -user root -o -name 'f*' \) #摩根定律找出/tmp目录下,属主不是root,且文件名不以f开头的文件
根据文件大小查找:
-size [+|-]#UNIT
常用单位:k,M,G
#UNIT:
(#-1,#] 如:5M 表示 (4M,5M]
-#UNIT:
[0,#-1] 如:-5M 表示 [0,5M]
+#UNIT:
(#,oo) 如:+5M 表示 (6M,oo)
关于文件大小查找的解释:为什么-size 5M 不是找精确的5M而是表示(4M,5M], 试想文件的大小指什么?是指文件数据的大小还是包括了元数据后的大小,文件的大小肯定是包含元数据后大小的,而我们一般以文件大小找文件时往往考虑的是文件整个数据的大小;另外,精确查找一定大小的文件意义不大;所以这里的大小会有1个单位的浮动。
示例:
[root@localhost etc]#find -size 3M #查找文件大小在[3,4)M(大于等于3M小于4M)之间的文件 [root@localhost etc]#find -size -3M #查找文件大小在[0,3)M之间的文件 [root@localhost etc]#find -size +3M #查找文件大小在(3,∞)M之间的文件
根据时间戳查找:
以”天”为单位:-atime/-mtime/-ctime通用
-atime [+|-]#
#: [#,#+1)
+#:
[#+1,oo)
-#: [0,#)
同理:以“分钟”为单位:-amin/-mmin/-cmin通用
关于时间戳查找的解释:为什么-atime 3 表示的是[3,4),我们这儿所说的时间是指时间段而非时刻,一“天”与一“分钟”都是指一个时间段,只有[3,4)这个半闭半开的区间才能完整地表示第三天。
根据权限查找:
-perm [/|-]MODE
MODE: 精确匹配权限
/MODE: 任何一类(u,g,o)对象的权限中只要能一位匹配即可,属于或关系。以前用‘+’,CentOS 7以‘/’替代之
-MODE: 每一类对象都必须同时拥有指定权限,属于与关系
0:表示不关注
示例:
[root@localhost etc]#find -perm 644 #表示要严格查找匹配644的文件 [root@localhost etc]#find -perm +222 #表示u,g,o任何一类用户有写权限即查找匹配 [root@localhost etc]#find -perm -222 #表示仅严格查找匹配写权限,即每个用户必须要有写权限 [root@localhost etc]#find -perm -002 # 表示仅严格查找匹配other用户的写权限
处理动作:
1. -print: 默认动作,显示至屏幕
2. -ls: 类似于对查找到的文件执行 ls -l 命令
3. -delete: 删除查找到的文件
4. -fls file: 查找到的所有长格式的信息保存至指定文件中
5. -ok COMMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,且都会交互式要求用户确认
6. -exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令;
7. {}: 用于引用查找至的文件名称自身
8. find 传递查找到的文件至后面指定的命令时,查找到所有符号条件的文件一次性传递给后面的命令
9. 有些命令不能接受过多的参数,此时命令执行可能会失败,用 xargs 来规避此问题 find |xargs COMMAND
示例:
[root@localhost etc]#find -perm 644 -print #查找到的结果显示在屏幕上 [root@localhost etc]#find -perm +222-ls #对查找到的结果长列出 [root@localhost etc]#find -perm -222 -delete #对查找到的结果进行删除 [root@localhost etc]#find -perm -002 -ok cp {} /tmp \; #对查找到的结果进行操作(拷贝结果到其他目录下)且会交互式要求用户确认, 注意:-ok 结尾必须是以空格加斜杠再加分号 \; [root@localhost etc]#find -perm -002 -exec cp {} /tmp \; #对查找到的结果进行操作(拷贝结果到其他目录下)不会交互式要求用户确认, 注意:-exec 结尾必须是以空格加斜杠再加分号 \;
原创文章,作者:Mozart,如若转载,请注明出处:http://www.178linux.com/84400