find命令详解

写在前面,命令总览:

文件名:-name  -iname   glob     从属关系: -user  -group  -uid  –gid  -nouser  -nogroup

按类型:-type []  ,f,d,l,b,c,p,s   组合测试:逻辑与或非-a  -o  ,-not,!   大小:-size  

 时间:-atime  –mtime   -amin  权限:-perm   处理动作:-print  -ls  -delete  -fls  -ok  -exec

find命令详解

一、简介

   find是一款文件查找工具,非常适合查找计算机上的文件。

二、与locate优缺点比较

   locate:

     优点:查找速度快,自动更新数据库

     缺点:依赖于数据库,非实时查找,结果非精确,模糊查找

   find:

     优点:精确匹配,实时查找,通过遍历指定路径文件系统层级结构完成文件查找

     缺点:查询速度较慢

 

find用法:

find [OPTIONS]  [查找起始路径]  [查找条件]  [处理动作]

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

查找条件:指定的查找标准,可以根据文件名、大小、类型、从属关系、权限等等标准进行;

默认为找出指定路径下的所有文件;

处理动作:对符合查找条件的文件做出的操作,例如删除等操作;默认为输出至标准输出;

 

查找条件

测试:结果常为布尔型(真假)

根据文件名查找:

-name ”pattern“

-iname “pattern”,  ignorecase   忽略大小写

           [root@yph7 tmp]# find /tmp -iname "gentoo"

/tmp/GENtoo

glob支持文件名通配

*, ?, [], [^]

[root@yph7 tmp]# find /tmp -iname "gen*"

/tmp/GENtoo

/tmp/gentext

根据文件从属关系查找:

-user USERNAME:查找属主指定用户的所有文件;

[root@yph7 tmp]# find /tmp -user breeze –ls    ——–    -ls指查看详细属性

  3552    8 -rw-rw-r–   1 breeze   breeze         19 12 16 06:13 /tmp/a.breeze

67202546    4 -rw——-   2 breeze   root         2800 12 18 06:17 /tmp/dir.root/passwd.root

67202546    4 -rw——-   2 breeze   root         2800 12 18 06:17 /tmp/dir.root/passwd.root.link

-group GRPNAME:查找属组指定组的所有文件;

[root@yph7 tmp]# find /tmp -group apache -ls

33554819    0 drwxrwsr-t   2 root     apache         51 12月 16 05:42 /tmp/text

33554841    0 -rw-rw-r–   1 hadoop   apache          0 12月 16 05:09 /tmp/text/b.hadoop

-uid UID:查找属主指定的UID的所有文件;

[root@yph7 tmp]# id -u hadoop

2051

[root@yph7 tmp]# find /tmp -uid 2051 -ls

33554841    0 -rw-rw-r–   1 hadoop   apache          0 12 16 05:09 /tmp/text/b.hadoop

33554840    0 -rw-rw-r–   1 hadoop   apache          0 12 16 05:34 /tmp/text/c.hadoop

-gid GID:查找属组指定的GID的所有文件;

[root@yph7 tmp]# id -g breeze

1004

[root@yph7 tmp]# find ./ -gid 1004 -ls

  3552    8 -rw-rw-r–   1 breeze   breeze         19 12月 16 06:13 ./a.breeze

-nouser:查找没有属主的文件;

[root@yph7 tmp]# find ./ -nouser -ls

   283    0 -rw-r–r–   1 2003     hadoop          0 12 20 20:06 ./a.mysql1

-nogroup:查找没有属组的文件;

[root@yph7 tmp]# find /home -nogroup -ls

   255    0 drwx——   3 breeze   4002           89 12月 13 05:52 /home/fedora

根据文件的类型查找:

-type TYPE

f: 普通文件

[root@yph7 tmp]# find ./ -type f -ls

   282    0 -rw-r–r–   1 root     root            0 12月 20 19:48 ./gentext

   283    0 -rw-r–r–   1 2003     hadoop          0 12月 20 20:06 ./a.mysql1

d: 目录文件

[root@yph7 tmp]# find /tmp -type d -ls

   133    4 drwxrwxrwt  11 root     root         4096 12月 20 20:06 /tmp

67156266    0 drwxrwxrwt   2 root     root            6 12月  8 21:20 /tmp/.X11-unix

l:符号链接文件

[root@yph7 tmp]# find /tmp -type l -ls

67202555  0 lrwxrwxrwx 1 root   root   11 12月 18 06:21 /tmp/ passwd.symbolink -> passwd.root

b:块设备 文件

[root@yph7 tmp]# find /dev -type b -ls

 10821    0 brw-rw—-   1 root     disk       8,   7 12月 20 18:02 /dev/sda7

 10820    0 brw-rw—-   1 root     disk       8,   6 12月 20 18:02 /dev/sda6

c:字符设备文件

p:管道文件

s:套接字文件

 

组合测试

-a,and逻辑与关系,为系统默认

[root@yph7 tmp]# find -name "pass*" -a -user flimmer –ls   ——–必须同时满足两个条件

   274    4 -rw-r–r–   1 flimmer  flimmer      2800 12月 17 22:18 ./passwd.flimmer

-o,or逻辑或关系

[root@yph7 tmp]# find /tmp \( -user flimmer -o -name "pass*" \) -ls

   270    4 -rw-r–r–   1 root     root         2800 12 16 18:43 /tmp/passwd

   273    0 -rw-r–r–   1 flimmer  flimmer         0 12 17 22:16 /tmp/a.flimmer

-not或者!:逻辑非关系

[root@yph7 tmp]# find /tmp -not -user root -ls

33554841    0 -rw-rw-r–   1 hadoop   apache          0 12月 16 05:09 /tmp/text/b.hadoop

33554831    4 -rw-rw-r–   1 gentoo   apache         95 12月 17 06:45 /tmp/text/c.gentoo

练习:

1、找出/tmp目录下文件名中不包含fstab字符串的文件;

[root@yph7 tmp]# find /tmp -not  -name "*passwd*"

2、找出/tmp目录下属主为非root,而且文件名不包含fstab字符串的文件;

[root@yph7 tmp]# find /tmp -not -user root -a -not -name "*fstab*" -ls

[root@yph7 tmp]# find -not \( -user root -o -name "*fstab*" \) –ls

[root@yph7 tmp]# find ! \( -user root -o -name "*passwd*" \) –ls

 

根据文件大小查找:

-size[+|-]#UNIT  常用单位:k(小写), M G

-5k:[0,5) ——–小于5k  ——个人理解

5k:(4,5] ——–5K的文件,大于4K,小于等于5K

+5k:(5,+oo) ———–大于5k的文件

[root@yph7 tmp]# find /tmp -size -5k  ———–小于5k的文件

/tmp

/tmp/.X11-unix

/tmp/.ICE-unix

 

以天为单位查找:

 -3 :过去的3天内不包括等于第3

3:过去的第二天到过去的第三天之间

+3 过去的第四天及第四天之前的时间,至少已经三天没访问了

 

-atime[+|-]#:最近一次访问时间

[root@yph7 text]# find ./ -atime -3  ———查看三天内访问过的文件

./                 ————没有三天内访问过的文件

 [root@yph7 text]# ll

总用量 4

-rw-rw-r–. 1 gentoo apache 95 12 17 06:45 c.gentoo

-rw-rw-r–. 1 hadoop apache  0 12 16 05:34 c.hadoop

 [root@yph7 text]# cat c.gentoo &> /dev/null   ——-现在就访问一次

 [root@yph7 text]# find ./ -atime -3

./

./c.gentoo [root@yph7 text]# cat ./b.hadoop ——–发现就找到了

 

[root@yph7 text]# stat ./c.gentoo  ————stat查看一下c.gentoo的时间戳

  文件:"./c.gentoo"

  大小:95            块:8          IO 块:4096   普通文件

设备:802h/2050d Inode33554831    硬链接:1

权限:(0664/-rw-rw-r–)  Uid( 4006/  gentoo)   Gid( 2011/  apache)

环境:unconfined_u:object_r:user_tmp_t:s0

最近访问:2015-12-20 22:14:40.159540734 +0800

最近更改:2015-12-17 06:45:08.922153037 +0800

最近改动:2015-12-17 06:45:08.922153037 +0800

-mtime最近一次修改文件内容时间

-ctime 最近一次修改元数据的时间。权限属性等,

[root@yph7 text]# find ./ -ctime -1  ———–最近一天内修改过元素据的文件,发现没有

./

[root@yph7 text]# chmod o+w c.gentoo ——-修改下元素据,更改下权限

[root@yph7 text]# find ./ -ctime -1

./

./c.gentoo       ————就能找到了


以分钟为单位查找 用法与根据天查找相同

-amin:最近一次访问时间,以分钟为单位

[root@yph7 tmp]# find ./ -amin -3  ——-查找3分钟内访问过的文件,发现没有

[root@yph7 tmp]# cat ./c.root > /dev/null  ——–现在访问一次

[root@yph7 tmp]# find ./ -amin -3

./c.root                 ————就能查找到了

-mmin:最近一次修改内容时间,分钟为单位

[root@yph7 tmp]# find ./  -mmin +3  —查找三分钟之前修改过内容的文件,发现所有文件都列了出来

./                                   —–因为三分钟内没有修改过文件内容,所有文件都符合条件

./.X11-unix

./.ICE-unix

./.XIM-unix

………………………………………

-cmin:最近一次修改元数据时间,分钟为单位,权限属性等

 

根据权限查找

-perm  [/|-]mode

mode:精确权限匹配

[root@yph7 text]# find ./ -perm 664 –ls   ——–查找权限为664的文件

33554840    0 -rw-rw-r–   1 hadoop   apache          0 12 16 05:34 ./c.hadoop

/mode:任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足;只需有任何一个交集

9位权限之间存在“或”关系只需满足其中任何一个;比如一个权限为rw-r—-的文件,为“-”的位就忽略不考虑,只考虑出现”r或w或x”这三个字母的位,即只认为有r,w,r,权限,如果模式为/034,即—-wx—,文件权限中有一个w,模式中也有一个w这就匹配到了。如果为/100,即x——–,只有一个x,但文件权限例一个x都没有,就不能匹配到。

[root@yph7 text]# chmod 640 c.gentoo

[root@yph7 text]# find ./ -perm /034 -ls

33554819    0 drwxrwsr-t   2 root     apache         36 12 20 22:13 ./

33554840    0 -rw-rw-r–   1 hadoop   apache          0 12 16 05:34 ./c.hadoop

[root@yph7 text]# find ./ -perm /100

./

[root@yph7 text]#

-mode:每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足;必须完全包括模式

9位权限之间存在“与”关系;ugo三类用户的权限都必须多与或等于模式给出的对应的权限。比如A文件权限为rw-r—–,B文件权限为rw-rw-r–,模式rw-rw——满足B不能满足Ar—r—–能同时满足AB。要想满足A就必须少与或等于rw-r—–,要满足B就必须少于或等于rw-rw-r–.

[root@yph7 text]# ll

总用量 4

-rw-r—–. 1 gentoo apache 95 12月 17 06:45 c.gentoo

-rw-rw-r–. 1 hadoop apache  0 12月 16 05:34 c.hadoop

[root@yph7 text]# find ./ -perm -444

./

./c.hadoop

 [root@yph7 text]# find ./ -perm -400

./

./c.gentoo

./c.hadoop

[root@yph7 text]# find ./ -perm -440

./

./c.gentoo

./c.hadoop

[root@yph7 text]# find ./ -perm -664

./

./c.hadoop

[root@yph7 text]# find ./ -perm -663

[root@yph7 text]# find ./ -perm -640

./

./c.gentoo

./c.hadoop

 

处理动作

-print:输出至标准输出;默认的动作;

-ls:类似于对查找到的文件执行“ls -l”命令,输出文件的详细信息;

-delete:删除查找到的文件;

[root@yph7 text]# ll

总用量 4

-rw-r—–. 1 gentoo apache 95 12 17 06:45 c.gentoo

-rw-rw-r–. 1 hadoop apache  0 12 16 05:34 c.hadoop

[root@yph7 text]# find ./ -perm -444 -delete

find: 无法删除 ./: 无效的参数

[root@yph7 text]# ll

总用量 4

-rw-r—–. 1 gentoo apache 95 12 17 06:45 c.gentoo  —-c.hadoop已经被删掉了

-fls /PATH/TO/SOMEFILE:把查找到的所有文件的长格式信息保存至指定文件中;

[root@yph7 tmp]# cat c.root

[root@yph7 tmp]# find -name "pass*" -fls ./c.root

[root@yph7 tmp]# cat c.root

   270    4 -rw-r–r–   1 root     root         2800 12 16 18:43 ./passwd

   274    4 -rw-r–r–   1 flimmer  flimmer      2800 12 17 22:18 ./passwd.flimmer

67202546    4 -rw——-   2 breeze   root         2800 12 18 06:17 ./dir.root/passwd.root

67202546    4 -rw——-   2 breeze   root         2800 12 18 06:17 ./dir.root/passwd.root.link

-ok COMMAND {} \;   :对查找到的每个文件执行由COMMAND表示的命令;每次操作都由用户进行确认;

-exec COMMAND {} \;  :对查找到的每个文件执行由COMMAND表示的命令;

注意:find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令;

但是有些命令不能接受过长的参数,此时命令执行会失败;另一种方式可规避此问题:

find | xargs COMMAND

 

[root@yph7 text]# find ./ -perm -440 -ls -ok  mv {} {}.bak \;  ——–会询问是否要进行

33554819    0 drwxrwsr-t   2 root     apache         21 12月 20 23:56 ./

< mv … ./ > ? y

mv: 无法将"./" 移动至"./.bak": 设备或资源忙

33554831    4 -rw-r—–   1 gentoo   apache         95 12月 17 06:45 ./c.gentoo

< mv … ./c.gentoo > ? y

[root@yph7 text]# ll

总用量 4

-rw-r—–. 1 gentoo apache 95 12月 17 06:45 c.gentoo.bak

 

[root@yph7 text]# find ./ -perm -440 -ls

33554819    0 drwxrwsr-t   2 root     apache         21 12月 20 23:22 ./

33554831    4 -rw-r—–   1 gentoo   apache         95 12月 17 06:45 ./c.gentoo

[root@yph7 text]# find ./ -perm -440 -ls -exec mv {} {}.bak \;   ——-不会询问你,直接进行

[root@yph7 text]# ll

总用量 4

-rw-r—–. 1 gentoo apache 95 12月 17 06:45 c.gentoo.bak

 

[root@yph7 tmp]# find /etc -name "issue*" -exec cat {} &> /tmp/c.root \;

[root@yph7 tmp]# cat /tmp/c.root

\S

Kernel \r on an \m

Mage Education Learning Services

http://www.magedu.com

\S

Kernel \r on an \m

 

 

练习:

1、查找/usr目录下不属于root, bin或hadoop的所有文件或目录;用两种方法;

[root@yph7 tmp]# find /usr -not -user root -a -not -user bin -a -not -user hadoop

[root@yph7 tmp]# find /usr -not \( -user root -o -user bin -o -user hadoop \) -ls

2、查找/etc目录下最近一周内其内容修改过,且属主不是root用户也不是hadoop用户的文件或目录;

[root@yph7 tmp]# find /etc -mtime -7 -a -not \( -user root -o -user hadoop \) -ls

[root@yph7 tmp]# find /etc -mtime -7 -a -not -user root -a -not -user hadoop -ls

 

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

 [root@yph7 init.d]# find / \(  -nouser -o -nogroup  \) -a -atime -7 –ls

—必须加括号,否则-o与-a顺序不清楚

   283    0 -rw-r–r–   1 2003     hadoop          0 12月 20 20:06 /tmp/a.mysql1

   255    0 drwx——   3 breeze   4002           89 12月 13 05:52 /home/fedora

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

[root@yph7 text]# find /etc -size +1M -exec ls -lh {} \;

-r–r–r–. 1 root root 6.1M 12月  8 19:47 /etc/udev/hwdb.bin

-rw-r–r–. 1 root root 3.7M 3月   6 2015 /etc/selinux/targeted/policy/policy.29

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

[root@yph7 text]# find /etc -not -perm /222 -type f -ls

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

 [root@yph7 text]# find /etc -not -perm  -111 -type f –ls

67198001    4 -rw-r–r–   1 root     root           19 12月  8 20:43 /etc/locale.conf

67198008   12 -rw-r–r–   1 root     root        12288 12月  8 20:45 /etc/aliases.db

67202533    4 -rw-r–r–   1 root     root           17 12月  9 21:09 /etc/hostname

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

[root@yph7 tmp]# find /etc -perm -113 -type f -ls

[root@yph7 text]# find /etc/init.d -perm -111 -a -perm -002 -type f -ls

原创文章,作者:flivfox,如若转载,请注明出处:http://www.178linux.com/10273

(0)
上一篇 2016-02-14 10:10
下一篇 2016-02-14 10:12

相关推荐

  • linux如何获取帮助以及基础目录命名标准

    一、linux的命令分为两种,一种是内建命令,即包含在shell当中的,一种是外部命令,通常保存在 bin目录中。 1、对于内部命令:  通常使用 help COMMAND 2、对于外部命令:  通常使用 man command  mannul的位置/usr/share/man man的内容通常分为以下几块   1、N…

    Linux干货 2016-10-30
  • linux基础知识:计算机的组成及其功能

    摘要:
    1. 描述计算机的组成及其功能。
    2. 按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别。
    3. 描述Linux的哲学思想,按照自己的理解对其解释性描述。
    4. 说明Linux系统上命令的使用格式;详细介绍ifconfig、echo、……等命令使用,配合相应实例阐述。
    5. 如何获取帮助信息,描述man文档章节划分。
    6. 罗列发行版基础目录名称命名法则及功用规定。

    2017-12-03
  • linux用户与组管理

    一、linux用户与组管理的基本介绍 1、任何一个用户想要使用Linux系统都要向管理员申请一个账号,对这些账号的管理即是对用户的管理,所谓组,就是多个账号的集合。用户和组管理可以提高用户的管理效率、工作效率以及系统的安全性,比如将同一个部门的成员放在一个组里并设置权限,这样可有效的对资源共享,同时可以避免其他部门的人恶意破坏。 2、用户和组的管理内容一般有…

    Linux干货 2016-08-02
  • N28-第三周作业

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。
    2、取出最后登录到当前系统的用户的相关信息。
    3、取出当前系统上被用户当作其默认shell的最多的那个shell。
    4、将/etc/passwd中的第三个字段数值最大的后10个用户的信息全部改为大写后保存至/tmp/maxusers.txt文件中。
    5、取出当前主机的IP地址,提示:对ifconfig命令的结果进行切分。
    6、列出/etc目录下所有以.conf结尾的文件的文件名,并将其名字转换为大写后保存至/tmp/etc.conf文件中。
    7、显示/var目录下一级子目录或文件的总个数。
    8、取出/etc/group文件中第三个字段数值最小的10个组的名字。
    9、将/etc/fstab和/etc/issue文件的内容合并为同一个内容后保存至/tmp/etc.test文件中。
    10、请总结描述用户和组管理类命令的使用方法并完成以下练习:
    (1)、创建组distro,其GID为2016;
    (2)、创建用户mandriva, 其ID号为1005;基本组为distro;
    (3)、创建用户mageia,其ID号为1100,家目录为/home/linux;
    (4)、给用户mageia添加密码,密码为mageedu;
    (5)、删除mandriva,但保留其家目录;
    (6)、创建用户slackware,其ID号为2002,基本组为distro,附加组peguin;
    (7)、修改slackware的默认shell为/bin/tcsh;
    (8)、为用户slackware新增附加组admins;

    2017-12-17
  • Shell中的循环语句

    在编程语言中,循环语句是最基本的语法之一,在Shell(这里是Bash)中也不例外。把相关内容整理一下吧。 这里包括for/while/until循环,以及变量自增的语法实例。 Shell(以Bash为例)中的循环语句一般有for、while、until这几种,偶尔还有写错语法的时候,这里结合实例来自己总结一下。也为今后使用提供一个快捷的资料获取渠道。 一、…

    Linux干货 2016-08-22
  • Linux系统中的防火墙iptables

    iptables/netfilter——Linux系统下的防火墙 基本原理 防火墙主要功能 工作于主机或者网络边缘,对进出本主机或本网络的报文进行匹配检测,对匹配到规则的报文进行于规则相对应的处理。 防火墙主要分类 按功能分类 主机防火墙网络防火墙 按构成分类 软件防火墙硬件防火墙 Linux防火墙软件iptables/netfilter(以后简称iptab…

    Linux干货 2017-06-13