OrochWang

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

文件查找

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

# 列出家目录下的目录文件。
posted on 2018-08-08 17:57  OrochWang  阅读(306)  评论(0编辑  收藏  举报
//一下两个链接最好自己保存下来,再上传到自己的博客园的“文件”选项中