文件查找
locate 基于数据库来查找文件,是非及时性查找。通过数据库文件数据库位置 /var/lib/mlocate/mlocate.db来进行更新,使用updatedb命令可以更新数据库。
locate 的搜索,只会依赖于事先构建的索引,索引的构建是在系统较为空闲时自动进行(周期性任务)。索引构建后的数据,不会立即生效,需要管理员手动更新数据库(updatedb)。索引构建过程需要遍历整个根文件系统,极消耗资源。
locate特点:
1 查找速度快
2 模糊查找 包含关键字的也会显示
3 非实时查找 只会基于上一次的索引,除非管理员手动更新数据库(updatedb)
4 搜索的是文件的全路径,不仅仅是文件名 包含关键字的路径也会被显示出来。
5 可能只搜索用户具备读取和执行权限的目录 如果要搜索的用户没有对a目标有rx权限,那么a目标不会显示。
(rx,x代表能进,r代表能列)
locate +关键字
-i 不区分大小写的搜索
-n N 只列举前N个匹配项目 示例: -n 2 表示只显示结果的前两个。
-r 使用正则表达式
示例:
搜索名称或路径中带有“conf”的文件 # locate conf
使用Regex(正则表达式)来搜索以“.conf”结尾的文件
# locate -r ‘.conf$’
find
find查找工具 实时查找工具,通过遍历指定路径完成文件查找 如果什么条件都不指定,则将当前目录及子目录的
所有文件都列出来。
工作特点:
1 查找速度略慢
2 精确查找
3 实时查找
4 可能只搜索用户具备读取和执行权限的目录 如果要搜索的用户没有对a目标有rx权限,那么a目标不会显示。
(rx,x代表能进,r代表能列)
语法:
find [OPTION]... [查找路径] [查找条件] [处理动作]
查找路径:指定具体目标路径;默认为当前目录,且会递归。
查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件
处理动作:对符合条件的文件做操作,默认输出至屏幕
查找条件具体有如下几种:
搜索层级 默认全部递归,不管被搜索的目录是几层都会全部递归。
-maxdepth level 最大搜索目录深度,指定目录为第1级
-mindepth level 最小搜索目录深度
示例:
# find -maxdepth 3 -name yangyang # 查找当前目录下名为yangyang的文件,但最多递归3层。这三层包含.(.是当前目录) # find -mindepth 2 -name yangyahg # 查找当前目录下名为yangyang的文件,但最少递归2层。这二层不包含.(.是当前目录)
只在第n层目录内查找
# find -maxdepth 2 -mindepth 2 -name yangyahg # 只在当前目录的第二层查找名为yangyang的文件。
根据文件名和inode查找:
-name "文件名称":支持使用glob(通配符) *, ?, [], [^] -iname "文件名称":不区分字母大小写 -inum n 按inode号查找 -samefile name 相同inode号的文件 -links n 链接数为n的文件 任何一个目录的链接数至少是2,因为有.(当前目录)和..(上个目录)两个链接。所以可以得出,目录的硬链接数减去2,就是这个目录的子目录数量。 -regextype posix-extended -regex "PATTERN(正则表达式)":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称 # find /app -regextype posix-egerp -regex '/app/.(r..t)...1er' 前后的目录必须一致,否则报错. 查找app目录下,前后名字都有r..t且一致的文件 # root555rooter # find -regextype posix-extended -regex './.(r..t)...1er'是扩展正则, # ./aroot123rooter -regextype posix-basic -regex 是基本正则. -regextype posix-egerp -regex意思是使用和egrep一样的正则表达式,即扩展正则。
根据属主、属组查找:
-user USERNAME:查找属主为指定用户(UID)的文件 # find -user yangyang # 查找属主是yangyang的文件 -group GRPNAME: 查找属组为指定组(GID)的文件 # find -group li # 查找属组是li的文件。 -uid UserID:查找属主为指定的UID号的文件 -gid GroupID:查找属组为指定的GID号的文件 -nouser:查找没有属主的文件 因为用户被删除,所以看不到用户名了,但uid号还在的文件用此办法查看 -nogroup:查找没有属组的文件 因为组被删除,所以看不到组名了,但gid号还在的文件用此办法查看
根据文件类型查找: -type TYPE:
f: 普通文件 示例 # find -type f # 显示所有普通文件 d: 目录文件 l: 符号链接文件 即软链接 s:套接字文件 即网络端口通信文件。 b: 块设备文件 c: 字符设备文件 显示终端信息。 p: 管道文件
组合条件查找
组合条件:默认是与的关系,即-a
与:-a 或:-o 非:-not, ! !-a = -o (非与即或 )!-o = -a(非或即与)
条件1 -a 条件2 同时满足这两个条件
条件1 -o 条件2 满足其中给一个即可
(非 A)或(非 B) =非(A且 B)
(非 A)且(非 B) =非(A或 B)
!A -a !B = !(A-o B) 非条件1与非条件2 等于 非(条件1或条件2)
!A –o !B = !(A-a B) 非条件1和非条件2 等于 非(条件1或条件2)
条件1 -o 条件2 相当于数学中的并集
条件1 -a 条件2 相当于数学中的交集
# find -not -name 条件1 -a -not -name 条件2,用基本正则可写为
#find -not ( -name 条件1 -o -name 条件2 )
find示例
find -name snow.png //查找当前目录下,名字精确为snow.png的文件,区分大小写 find -iname snow.png //查找当前目录下,名字精确为snow.png的文件,不区分大小写 find /-name “*.txt” //查找根目录下,名字包含以.txt结尾的文件 find /var–name “*log*” //查找var目录下,名字包含log的文件. find -user joe -group joe //查找当前目录下,属主为joe,且属组为joe的文件 find -user joe -not -group joe //查找当前目录下,属主为joe,且属组不是joe的文件. find -user joe -o -user jane //查找当前目录下,属主是joe或jine的文件 find -not( -user joe -o -user jane ) //查找根目录下的,属主不是joe和jine的文件 find / -user joe -o -uid 500 //查找根目录下,属主是joe或UID号为500的文件.
找出/tmp目录下,属主不是root,且文件名不以f开头的文件
find /tmp ( -not -user root -a -not -name 'f*' ) -ls find /tmp -not ( -user root -o -name 'f*' ) –ls
排除目录示例:固定格式: -path ‘目录名’ -a -prune 排除一个指定目录查找/etc/下,除/etc/sane.d目录的其它所有.conf后缀的文件
find /etc -path 'etc/sane.d' -a -prune -o -name '*.conf'
查找/etc/下,除/etc/sane.d和/etc/fonts两个目录的其它所有.conf后缀的文件
find /etc ( -path '/etc/sane.d' -o -path 'etc/fonts' ) -a -prune -o -name "*.conf"
根据文件大小来查找:
-size [+|-]#UNIT
常用单位:k, M, G,c(byte)
输入单位#: (#-1, #] 大于等于#-1,到小于#之间。 中括号有大于等于的意思。小括号有小于的意思.
如:6k 表示(5k,6k] 5K到6K之间。
输入单位 -#:[0,#-1] 大于等于0.小于等于#-1
如:6k 表示[0,5k]
输入单位 +#:(#,∞) 大于等于#+1到正无限大,不包含输入的数值本身。
如:+6k 表示(6k,∞)
示例:
查找大于5M的文件
find -size +5M
查找小于5M的文件
find -size -6M
查找大于5M,小于6M的文件
find -size 5M
附:创建指定大小的文件
# dd if=/dev/zero of=/app/bigfile.img bs=1M count=5 bs是指定块的大小,count是块的个数。
# 在/app/下创建了一个名为bigfile.img且大小为5M的文件。
根据时间戳:
以“天”为单位;
-atime [+|-]#, -atime 最近一次的访问时间
#: [#,#+1) #到#+1天前之间。
-mtime 最近一次的修改时间
+#: [#+1,∞] #+1天之前。 -ctime 最近一次的状态时间(权限,用户,组,大小,修改时间等)
-#: [0,#) #天以内。
-mtime -ctime 示例:查找app/目录下,10分钟之内时间戳发生改变的文件.
# find /app -amin -10
以“分钟”为单位:
-amin -mmin -cmin
根据权限查找: -perm [/|-]MODE (因为+从centos7开始淘汰,centos7里面只能用/来表示.)
/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,是或的关系 举例:
挑选出当前目录下.属主或属组或其他人权限上有写权限的文件.
# find -perm /666
# 属主上有r,rw,w权限之一的, 或 属组上有r,rw,w权限之一的 或 其他人上有r,rw,w权限之一的的都会被匹配到.
r,rw,w三者满足其中之一即可,属主,属组,其他人只要有一项满足这些条件之一都符合.
PS: 如果是find -perm /000的话,只有/000才能匹配的到.
-MODE:每一类对象都必须同时拥有指定权限,是与的关系 举例:
挑选出当前目录下.属主,属组,其他人权限上都有写权限的文件.
# find -perm -222
# 属主上有w rw,wx权限 且 属组上有w rw,wx权限 且 其他人上有w rw,wx权限的才会被匹配到.三者之间必须同时满足条件才会被匹配到.
0 表示不关注,权限位为0的时候,使用或()关系判断的时候,会判断其他的权限位置.使用与(-)关系判断的时候,有一处权限位不符合都不会再判断.
# rw------- 1 # -----w---- 2 # -------wx 3 # r-------- 4 # find -perm 600
# 会匹配到1和4.
因为6里面包括r和w,属主上包括r的只有1和4,而属组和其他上都是0,
0表示不关心,故2和3虽然分别在其他人及属组上有符合的条件,但是不匹配.
同理,如果匹配项是022的话,值会匹配2和3.
find -perm 755 会匹配权限模式恰好是755的文件,与的关系时,仅匹配755.
或的关系时候,任何一位上满足条件都会列出.
只要当任意人有写权限时,find -perm +222就会匹配
只有当每个人都有写权限时,find -perm -222才会匹配
只有当其它人(other)有写权限时,find -perm -002才会匹配
查找后的处理动作: 通常放在命令最后
-print:默认的处理动作,显示至屏幕
-ls:类似于对查找到的文件执行“ls -l”命令
-delete:删除查找到的文件
fls file:查找到的所有文件的长格式信息保存至指定文件中
主要保存inode号,软链接次数,权限,之类的信息类似于ls -l后,显示的内容。
-ok COMMAND {} ; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认(很烦人的操作)
固定格式
# find -name "*.sh" -exec chmod +x {} ;,将查找出来 *.sh 的文件加上执行权限x.
其中 -exrc和;是固定格式,分别代表开始和结束,exec后面跟命令,{}当中固定引用参数。
这里引用的参数就是 "*.sh"
对当前目录下,所有f开头的文件做一个备份,备份名字为文件名.orig
# find -name "f*" -exec cp {} {}.orig ;
# 第一个{}是引用“f*”变量,第二个{}代表在当前目录下建立备份.orig。
如果将 -exec 改为 -OK 的话,那么电脑会在每一步都会发出询问。
参数替换:xargs
find和xargs格式:find | xargs COMMAND(命令)
由于很多命令不支持管道|来传递参数,而日常工作中有这个必要,所以就有了xargs命令
xargs用于产生某个命令的参数,xargs 可以读入 stdin(标准输入) 的数据,并且以空格符或回车符将 stdin
的数据分隔成为arguments(参数)
注意:文件名或者是其他意义的名词内含有空格符的情况
有些命令不能接受过多参数,命令执行可能会失败,xargs可以解决
示例:
ls f* |xargs rm 删除列出的文件 find /sbin -perm +700 |ls -l 这个命令是错误的,ls不支持接受管道传递过来的参数. find /sbin -perm +7000 | xargs ls –l # echo “a b c d e” |xargs touch # 相当于touch a b c d e xargs当中的参数,会一个一个的交给它后面的命令。 # find -name “*.conf” -exec cp {} {}.orig ; 备份配置文件,添加.orig这个扩展名 # find /tmp -ctime +3 -user joe -ok rm {} ; 提示删除存在时间超过3天以上的joe的临时文件,-ok会每一步都提醒。 # find ~ -perm -002 -exec chmod o-w {} ; 在你的家目录中寻找可被其它用户写入的文件,并去除掉这个权限。 # find /data –type f -perm 644 -name “*.sh” –exec chmod 755 {} ; 在/date目录下的普通文件。权限为644且以。sh结尾的,给这写文件的权限改为755. # find /home –type d -ls # 列出家目录下的目录文件。