上次我们简单了解了下grep跟egrep的简单用法,这次,聊聊文件查找的“利器”find命令的简单使用方法。

   find命令的使用格式:find [options][查找路径][查找条件][处理动作]。

中括号表示这些选项、参数都可以省略,所以find默认是查找的当前路径下的所有文件。

不过我们一般都会跟一个.来表示当前路径。例如:

find--->文件查找的"利器"_文本查找

它默认会找出当前路径下的所有文件,包括目录下的子文件。

    [查找路径]我们就不说了相信大家都懂,那我们简单说说几个find常用到的查找条件:

    1:-name:根据文件的名称查找,例如:查找/etc下叫passwd的文件。

find--->文件查找的"利器"_find_02

name命令使用注意两点:

    一:按名称查找是要严格区分大小写的,所以name可以跟-i一起使用:-iname 忽略大小写进行查找。

    二:如果查找的文件名称中有空格,那么这个文件名需要用双引号引起来。另外,文件名查找支持globbing(文件名通配)

    我们这里可以简单题下常用的通配符,*:表示任意长度的字符;?:表示任意一个字符;[...]:表示匹配括号范围内的任意一个字符[A-Z][0-9]表示在字母A-Z的范围内,数字0-9的范围内;{...}:表示括号里的字符要逐一匹配括号前跟括号后的字符串。

     2:-user:根据属主查找。

     3:-group:根据属组查找。

例:在/tmp目录下查找属主是root123 或者是 属组是root456的文件:find--->文件查找的"利器"_文本查找_03

大家 可以看到我们在命令中使用了-o这个参数,那么我们接着介绍3个参数其中2个是组合条件查找,一个是取反条件查找:

-a:与,前后两个条件要同时满足。

-o:或,前后有1个满足即可。

-not:取反“不是”的意思。例如我们查找/tmp属主不是root123的文件

find--->文件查找的"利器"_find_04

接着我们要说几个比较有意思查找条件:例如,我们要查找/ttmp目录下属主不是root123且不是以txt结尾的文件:

find--->文件查找的"利器"_find_05

我们在用另一种方式来实现这种结果:

find--->文件查找的"利器"_find_06

大家可以看到结果一样是吧?那么下面这个命令是什么意思呢?就是属主是root123或者以.txt结尾的文件 整体取反,这是什么概念?---这就是奥古斯都·德·摩根定律:

非(P 且 Q)=(非 P)或(非 Q)

非(P 或 Q)=(非 P)且(非 Q)

相信大家这下很容易理解了。那么我在说一个题大家可以自己去尝试,

例:我们要在/ttmp中找出属主不是roou456或者不是以.doc结尾的文件。大家可以自己创建几个不同用户的文件尝试去敲下命令。下面我们继续说find命令的查找条件:

    3:-uid

    4:-gid

         基于用户的UID跟GID号进行查找,这种情况一般用于我们删除了某个用户,但是没有使用-r选项连用户的家目录文件一并删除,根据用户当时的UID或者GID进行查找他当时的文件。

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

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

    7:-type:根据文件类型查找,那么常见的文件类型有那些:我们简单罗列一下:

    -b:块设备

    -c:字符设备

    -d:目录文件

    -f:普通文件

    -l:链接文件

    -p:管道文件

    -s:套接字文件

使用格式: find /etc -type f 查找/etc目录下的普通类型的文件。

    8:-size:根据文件大小查找,常用{+|-}n 表示大于或小于某个数字的范围,常用单位是 k,M,G

例:我们查找/tmp下 4k大小的文件:

find--->文件查找的"利器"_文本查找_07

我们会发现3.1k大小的那个文件也出现在了查找结果中。我们接着查看-|+ 4k的结果:

find--->文件查找的"利器"_find_08

主要想让大家看2个文件1个的3.1k的那个文件1个是3.0k的那个文件大家会发现在查找的结果里找不到3.1k大的那个文件。但是3.0的却可以找到。接着我们看+4k的查找结果:

find--->文件查找的"利器"_文本查找_09

大家看那个4.9k大的文件也会在查找结果中显示:所以在这里我们总结一下:

find /path -size n {k|M|G}  的查找范围是 n-1<x<=n

find /path -size -n {k|M|G} 的查找范围是 <=n-1的范围以下。

find /path -size +n {k|M|G} 的查找范围就是>n的范围。

   -9:根据时间戳查找,以天为单位 -atime;-mtime;-ctime;以分钟为单位就是-amin;-mmin;-cmin;我们在补充点知识点,文件的时间戳都有那些?

    ①:Access  访问时间

    ②:Modify  修改时间

    ③:Change  改变时间

    查看时间戳的命令是:stat file_Name

    修改时间戳的命令是:touch {-c|-m|-a} --date+要修改的时间,解释下我的花括号是里面的参数选择其一。

    那我们查找访问时间是3天前被访问的文件:今天是2014-03-03find--->文件查找的"利器"_find_10

可以看到27号23:59:59的文件也属于三天内的,但是刚好27号正点的文件是3天外的。

范围是:x=>n+1天

我们要查看第三天访问过的文件:

find--->文件查找的"利器"_find_11

大家可以看到刚到27号1号2月28号过了整的的时候被访问的文件是不会在查找结果中的

范围是:n+1>x=>n

我们在看3天内被访问的文件:

find--->文件查找的"利器"_文本查找_12

大家可以看到2月28号00:00:00被访问的文件没有被查询到 范围是 x<n-1天

    -10:根据权限查找:

     find /path -perm [+|-] MODE

     +|-省略表示做精确匹配 例:

     查找/etc/目录下权限为600的文件:#find /etc/ -perm 600

     +MODE:表示任何一类用户的任何一位权限匹配即可

例: 在/ttmp文件的权限默认为644,我要查找+222权限的文件

find--->文件查找的"利器"_文本查找_13

可以看到只要有1个位的权限匹配到就会列出所匹配的文件。如果是+002则不会显示:常用于查找某类用户的某特定权限是否存在。   

find--->文件查找的"利器"_find_14

-MODE:表示每类用户的指定要检查的权限位都匹配

例:查找所有用户都有读的权限 -444

find /etc/ -perm -444

find--->文件查找的"利器"_find_15

find--->文件查找的"利器"_find_16

   处理动作:默认是-print打印输出

             -ls:以常格式输出各文件信息

             -exec COMMAND \; 对查找到的文件执行指定的命令

例如:

find--->文件查找的"利器"_find_17

   与-exec等同的命令是 -ok COMMAND \;

    OK,find命令常用的基本知识就介绍到这。欢迎大家指出不足之处,相互学习。谢谢!