首页 > 代码库 > find命令详解

find命令详解

目录

<style>p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; font-size: 14.0pt; font-family: 等线 } h1 { margin: 0cm; margin-bottom: .0001pt; text-align: justify; line-height: 30.0pt; page-break-after: avoid; font-size: 16.0pt; font-family: 等线; font-weight: bold } h2 { margin: 0cm; margin-bottom: .0001pt; line-height: 30.0pt; page-break-after: avoid; font-size: 16.0pt; font-family: 楷体; font-weight: bold } h3 { margin: 0cm; margin-bottom: .0001pt; text-align: justify; line-height: 30.0pt; page-break-after: avoid; font-size: 14.0pt; font-family: 等线; font-weight: bold } p.MsoToc1,li.MsoToc1,div.MsoToc1 { margin: 0cm; margin-bottom: .0001pt; text-align: justify; font-size: 14.0pt; font-family: 等线 } p.MsoToc2,li.MsoToc2,div.MsoToc2 { margin-top: 0cm; margin-right: 0cm; margin-left: 21.0pt; margin-bottom: .0001pt; text-align: justify; font-size: 14.0pt; font-family: 等线 } p.MsoToc3,li.MsoToc3,div.MsoToc3 { margin-top: 0cm; margin-right: 0cm; margin-left: 42.0pt; margin-bottom: .0001pt; text-align: justify; font-size: 14.0pt; font-family: 等线 } p.MsoDate,li.MsoDate,div.MsoDate { margin-top: 0cm; margin-right: 0cm; margin-left: 5.0pt; margin-bottom: .0001pt; text-align: justify; font-size: 14.0pt; font-family: 等线 } a:link,span.MsoHyperlink { color: blue; text-decoration: underline } a:visited,span.MsoHyperlinkFollowed { color: #954F72; text-decoration: underline } p { margin-right: 0cm; margin-left: 0cm; font-size: 12.0pt; font-family: 宋体 } code { font-family: 宋体 } p.MsoNoSpacing,li.MsoNoSpacing,div.MsoNoSpacing { margin: 0cm; margin-bottom: .0001pt; text-align: justify; font-size: 14.0pt; font-family: 等线 } p.MsoListParagraph,li.MsoListParagraph,div.MsoListParagraph { margin: 0cm; margin-bottom: .0001pt; text-align: justify; text-indent: 21.0pt; font-size: 14.0pt; font-family: 等线 } p.MsoTocHeading,li.MsoTocHeading,div.MsoTocHeading { margin-top: 12.0pt; margin-right: 0cm; margin-left: 0cm; margin-bottom: .0001pt; line-height: 107%; page-break-after: avoid; font-size: 16.0pt; font-family: "等线 Light"; color: #2F5496 } span.2 { font-family: 楷体; font-weight: bold } span.3 { font-family: 楷体; font-weight: bold } span.1 { font-family: 黑体; font-weight: bold } span.a { font-family: 楷体 } span.SpellE { } span.GramE { } .MsoChpDefault { font-family: 等线 } div.WordSection1 { } ol { margin-bottom: 0cm } ul { margin-bottom: 0cm }</style>

前言

一、locate命令

1.1 locate用法

1.2 locate特点

1.3 locate查询补充

二、find命令

2.1 find命令特点

2.2 find用法

2.3 find选项

2.3.1 指搜索层级查找

2.3.2 按文件名和inode号查找

2.3.3 根据属主查找

2.3.4 根据属组查找

2.3.5根据文件类型查找

2.3.6组合查找

2.3.7 按文件大小查找

2.3.8 按时间戳查找

2.3.9 按权限查找

2.4 find补充

2.4.1 处理动作

三、小练习

 

前言

我们的系统中有很多文件,在我们日常使用过程中,经常需要查找一些符合某条件的文件,如果一个一个文件夹翻下来的话,无疑效率是很慢的,接下来,就给大家介绍两个命令,能让我们在系统中快速的查找到我们所需要的文件。

两个命令分别为locatefindlocate很简单,我们就简单介绍一下,本文主要还是介绍find的具体用法。

 

一、locate命令

locate命令实际上是查询数据库中的内容,所以搜索的速度很快,但是想要使用locate命令查询,我们就要事先构建好索引,索引的构建过程需要遍历整个根文件系统,极消耗资源。下面我们来说一下locate的具体用法和特点

1.1 locate用法

命令:locate

格式:locate KEYWORD

选项:  -i   不区分大小写的搜索

        -n N    只列举前N匹配项目

        -r   支持正则表达式

1.2 locate特点

  •    查找速度快
  •    模糊查找
  •    非实时查找
  •    搜索的是文件的全路径,不仅仅是文件名
  •    可能只搜索用户具备读取和执行权限的目录

 

1.3 locate查询补充

使用locate查询,实际是对数据库储存内容的列出,在查找前会判定目录有没rx权限,如果没有权限,依然不列出。此操作在数据库中进行,而非实时查询。如果我们想在不退出登录的情况下更新数据库,则要用到updatedb命令,该命令更新很慢,具体时间视你的系统中有多少文件而定。

 

二、find命令

由于locate的非精确查找和非实时查找的特性,导致locate用的不多。而find命令支持实时查找,拥有众多查找选项,linux上查找最常用的,但是缺点也是比较明显: 如果文件数量很多的话,查找起来很慢。但那又如何,find依然是最有用且最常用的Linux查找命令。

2.1 find命令特点

  •    查找速度略慢
  •    精确查找
  •    实时查找
  •    可能只搜索用户具备读取和执行权限的目录

 

2.2 find用法

命令:find

格式:find [OPTION]... [查找路径] [查找条件] [处理动作]

查找路径:指定具体目标路径;默认为当前目录 

查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件

处理动作:对符合条件的文件做操作,默认输出至屏幕

 

2.3 find选项

2.3.1指搜索层级查找

-maxdepth level 最大搜索深度

-mindepth level  最小搜索深度

Example

 1  [root@ keer app]#find -maxdepth 7
 2 
 3 .
 4 
 5 ./dev1
 6 
 7 ./dev1/dev2
 8 
 9 ./dev1/dev2/dev3
10 
11 ./dev1/dev2/dev3/dev4
12 
13 ./dev1/dev2/dev3/dev4/dev5
14 
15 ./dev1/dev2/dev3/dev4/dev5/dev6
16 
17 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7
18 
19 [root@ keer app]#find -mindepth 7
20 
21 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7

 

2.3.2 按文件名和inode号查找

-name “文件名称  基于名称的精确查找

-iname   基于名称忽略大小写的精确查找

-inum n   基于inode号查找(只显示名称,长列出则加-ls

-samefile   基于相同inode号的查找(查找硬链接)

-links n   硬链接为n的文件

-regex “PATTERN”  支持正则(默认只支持范围,不支持通配符)

-regextype egrep -regex    支持egrep同标准的正则

Example

 1 [root@ keer app]#find -name hello
 2 
 3 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7/hello
 4 
 5 [root@ keer app]#find -iname HELLO
 6 
 7 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7/hello
 8 
 9 [root@ keer app]#find -inum 1310721
10 
11 ./dev1
12 
13 [root@ keer app]#find -inum 1310721 -ls
14 
15 1310721    4 drwxr-xr-x   3 root     root         4096 Aug  8 16:47 ./dev1
16 
17 #因为find -regex匹配的是整个路径,所以前面必须加.*才可以
18 
19 [root@ keer app]#find . -regex ".*[a-z].*"
20 
21 ./dev1
22 
23 ./dev1/dev2
24 
25 ./dev1/dev2/dev3
26 
27 ./dev1/dev2/dev3/dev4
28 
29 ./dev1/dev2/dev3/dev4/dev5
30 
31 ./dev1/dev2/dev3/dev4/dev5/dev6
32 
33 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7
34 
35 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7/hello

 

2.3.3 根据属主查找

-user 用户名  基于文件owner的查找

-uid userid 基于文件uid的查找

-nouser 查找没有owner的文件

Example

 1 [root@ keer app]#find -user root
 2 
 3 .
 4 
 5 ./dev1
 6 
 7 ./dev1/dev2
 8 
 9 ./dev1/dev2/dev3
10 
11 ./dev1/dev2/dev3/dev4
12 
13 ./dev1/dev2/dev3/dev4/dev5
14 
15 ./dev1/dev2/dev3/dev4/dev5/dev6
16 
17 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7
18 
19 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7/hello
20 
21 [root@ keer app]#find -uid 0
22 
23 .
24 
25 ./dev1
26 
27 ./dev1/dev2
28 
29 ./dev1/dev2/dev3
30 
31 ./dev1/dev2/dev3/dev4
32 
33 ./dev1/dev2/dev3/dev4/dev5
34 
35 ./dev1/dev2/dev3/dev4/dev5/dev6
36 
37 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7
38 
39 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7/hello
40 
41 [root@ keer app]#find -nouser
42 
43 ./aaa

 

2.3.4 根据属组查找

-group 组名 基于文件group的查找

-gid groupid 基于文件gid的查找

-nogroup 查找没有group的文件

Example

 1 [root@ keer app]#find -group root
 2 
 3 .
 4 
 5 ./dev1
 6 
 7 ./dev1/dev2
 8 
 9 ./dev1/dev2/dev3
10 
11 ./dev1/dev2/dev3/dev4
12 
13 ./dev1/dev2/dev3/dev4/dev5
14 
15 ./dev1/dev2/dev3/dev4/dev5/dev6
16 
17 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7
18 
19 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7/hello
20 
21 [root@ keer app]#find -gid 0
22 
23 .
24 
25 ./dev1
26 
27 ./dev1/dev2
28 
29 ./dev1/dev2/dev3
30 
31 ./dev1/dev2/dev3/dev4
32 
33 ./dev1/dev2/dev3/dev4/dev5
34 
35 ./dev1/dev2/dev3/dev4/dev5/dev6
36 
37 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7
38 
39 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7/hello
40 
41 [root@ keer app]#find -nogroup
42 
43 ./aaa

 

2.3.5根据文件类型查找

-type TYPE:

f: 普通文件

d: 目录文件

l: 符号链接文件

s:套接字文件

b: 块设备文件

c: 字符设备文件

p: 管道文件

Example

 1 [root@ keer app]#find -type f
 2 
 3 ./aaa
 4 
 5 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7/hello
 6 
 7 [root@ keer app]#find -type d
 8 
 9 .
10 
11 ./dev1
12 
13 ./dev1/dev2
14 
15 ./dev1/dev2/dev3
16 
17 ./dev1/dev2/dev3/dev4
18 
19 ./dev1/dev2/dev3/dev4/dev5
20 
21 ./dev1/dev2/dev3/dev4/dev5/dev6
22 
23 ./dev1/dev2/dev3/dev4/dev5/dev6/dev7

 

2.3.6组合查找

  •    查找条件:

与:-a(可省略)

或:-o  非:-not, !

  •    德·摩根定律:

( A) ( B) = (A B)

( A) ( B) = (A B)

Example

1 !A -a !B = !(A -o B)
2 
3 !A -o !B = !(A -a B)

 

2.3.7 按文件大小查找

-size [+|-]#UNIT 根据文件大小来查找

常用单位:k, M, Gcbyte

#UNIT: (#-1, #]如:6k 表示(5k,6k]

-#UNIT[0,#-1]如:-6k 表示[0,5k]

+#UNIT(#,)如:+6k 表示(6k,)

更直观的可以从下图中看出:

技术分享

 

 

2.3.8 按时间戳查找

  •    以“天”为单位

-atime [+|-]#

#UNIT: [#,#+1) 例:3 表示前3天到4

-#UNIT[#+1,∞]  例:-3 表示4天以前

+#UNIT[0,#)  例:+3 表示三天之内

-mtime

-ctime

  •      分钟为单位

-amin

-mmin

-cmin

    更直观的可以从下图中看出:

技术分享

 

 

2.3.9 按权限查找

-perm

mode:精确权限匹配

           +mode[/mode] 任何一类(u,g,o)对象的权限中只要能一位匹配即可(或关系)。(“+”从centos7开始淘汰)

           -mode 每一类对象都必须同时拥有指定权限(与关系)

注:0 表示不关注。

Example

?  find -perm 755会匹配权限模式恰好是755的文件

?  只要当任意人有写权限时,find -perm /222就会匹配

?  只有当每个人都有写权限时,find -perm -222才会匹配

?  只有当其它人(other)有写权限时,find -perm -002才会匹配(/002也可)                                                               

 

 

2.4 find补充

2.4.1 处理动作

    -print 默认

    -delete 直接删除所查找到的文件,不询问。

    -ls 长列出所查找到的文件

    -fls file 将查找到的文件长列出导入到指定文件。

        配合重定向使用> file

    -ok command \; 对查找到的文件当做下一命令的参数去执行(交互式确认)

-exec command \; 对查找到的文件当做下一命令的参数去执行(非交互式)

注:使用-ok-exec时,必须以“ \;”结尾

Example

1、备份以“.conf”结尾的文件,并添加.orig扩展名

1 find-name “*.conf” -exec cp {} {}.orig \;

 

2、在你的主目录中寻找可被其它用户写入的文件,并取消这些文件其他用户的写权限

1 find ~ -perm -002   -exec chmodo-w {} \;

 

 

 

2.4.2 参数替换xargs

在我们使用的过程中,由于很多命令不支持管道符“|”来传递参数,但是在我们的日常工作中有这个必要,于是,就出现了xargs命令。xargs用于产生某个命令的参数,可以读入 stdin 的数据,并且以空格符或回车符将 stdin 的数据分割成为 arguments在这里我们需要注意的是,文件名或者其他意义的名词内含有空格符的情况。

当然,有些命里不能接受过多参数,这样命令可能会执行失败,这种情况也可以用xargs来解决。

Example

1、寻找以f开头的文件,并删除。

1 ls f* |xargs     rm

 

2、寻找/sbin下所属者权限位为满的文件,并长列出。

1 find /sbin -perm +700 | xargs ls –l

 

 

三、小练习

  说了这么多,我们来做一些练习练练手吧~活学活用才能更好的掌握喏?(?????)?

1、查找/var目录下属主为root,且属组为mail的所有文件

1 find /var -user root -group mail -ls

 

2、查找/var目录下不属于root、lp、gdm的所有文件

1 find /var ! \( -user root -o -user lp -o -user gdm \) -ls

 

3、查找/var目录下最近一周内其内容修改过,同时属主不为root、也不是postfix的文件

1 find /var -mtime +7 ! \( -user root -user postfix \) -ls

 

4、查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件

1 find / -nouser -o -nogroup -atime +7 -ls

 

5、查找/etc目录下大于1M且类型为普通文件的所有文件

1 find /etc/ -size +1M -type f -ls

 

6、查找/etc目录下所有用户都没有写权限的文件

1 find /etc/ ! -perm /222 -ls

 

7、查找/etc目录下至少有一类用户没有执行权限的文件

1 find /etc/ ! -perm -111 -ls

 

8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件

1 find /etc/init.d/ -perm -113 -ls

 

  以上。如有不足之处还请大家多多指教喏?(?>?<?)?

find命令详解