语法:

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

查找路径:默认为当前路径;

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

        

根据文件名进行查找

-name "文件名称": 支持使用glob;即通配符 *, ?, []

-iname "文件名称":不区分字符大小写,支持使用glob;

-regex"PATTERN":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称;

    例:find /root -regex "/root/x.*"  一定要写上查找路径,默认当前路径也不能省略

 

根据属主、属组查找

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

-group GROUPNAME:

-uid UserID: 查找文件的属主指定uid的文件;

-gid GroupID:

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

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

例:

find / -nouser -a -nogroup 查找没有属主、属组的文件

 

根据文件类型进行查找

-type TYPE

f: 普通文件

d: 目录

l: 符号链接

b: 块设备

c: 字符设备

p: 命名管道

s: 套接字

例:

find / -user dx -type f 查找用户名为dx文件类型为普通的文件

 

组合查找条件:

与条件:-a

或条件:-o

非条件:-not, !

 

!A -o !B = !(A -a B)

!A -a !B = !(A -o B)


例:

find / -user dx -type f 默认为与条件

find / -user dx -o -type l查找用户名为dx或文件类型为符号链接的文件

find / ! -user dx 查找用户名不是dx的文件

 

根据文件大小进行查找

-size [+|-]#unit #为一个整数

1. #unit    例如-size 3k  要注意!这里含义是一个范围{3-1,3} 即2K至3K

2. +#unit   例如-size +3k 这个好理解,意思是3K以上

3. -#unit   等于{0,#-1} 例如-size -3k 这里又要注意了!又是一个范围了,小于{3-1}K,即小于2K

       

根据时间进行查找:

   这里又分以天(24小时)为单位:

       -atime  访问时间。如 ls, more 等, 但 chmod, chown, ls, stat 等不会修改些时间, 使用 ls -utl 可以按此时间顺序查看;

       -mtime  修改时间。如 chmod, chown 等状态时间改变但修改时间不会改变, 使用 stat file 可以查看;

       -ctime  改变时间。如 vi 保存后等, 修改时间发生改变的话, atime 和 ctime 也相应跟着发生改变。

    这里时间的条件使用也很特别!例如:

   -mtime 4 表示查找5天前4天后被修改的,大于等于4小于5

   -mtime +4 表示5天后被修改的,大于等于5

   -mtime -4 表示4天以内被修改的,小于4

 按文件修改时间查找文件

     ---(+n)----------|----------(n)---------    -|----------(-n)---

    (n+1)*24H前|   (n+1)*24H~n*24H间   |n*24H内

     -ctime -n    查找距现在 n*24H 内修改过的文件

     -ctime n    查找距现在 n*24H 前, (n+1)*24H 内修改过的文件

     -ctime +n    查找距现在 (n+1)*24H 前修改过的文件

    以分钟为单位:

   -amin 访问

   -mmin 修改

   -cmin  改变


 注意: linux 里是不会记录文件的创建时间的, 除非这个文件自创建以来没有发生改变, 那么它的创建时间就是它的最后一次修改时间。

    #ls -lt /home/admin   # 按修改时间顺序查看

    #ls -lut /home/admin  # 按访问时间顺序查看

    (如果想反序查看的话需要加一个选项 -r)

    ls –tl file   按时间顺序显示

                            

根据权限:

-perm [/|-]MODE

MODE: 精确权限匹配

/MODE:任何一类对象(u,g,o)的任何一位权限符合条件即可;隐含或条件;

-MODE:为每一类对象指定的每一位权限都必须同时存在方为符合条件;隐含与条件;每一类用户的权限都包含对其指定的所有权限。即至少有指定的权限!

例:

#find  /tmp  -perm 755   //查找在/tmp目录下权限是755的文件

#find  /tmp  -perm +222  //表示只要有一类用户(属主,属组,其他)的匹配写权限就行

#find  /tmp  -perm -222  //表示必须所有类别用户都满足有写权限

 

处理动作:

-print: 默认处理动作,默认为输出至屏幕

-ls:类似于对查找到的每个文件做"ls -l"的操作;

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

-fls /path/to/somefile:查找到的文件的详细路径信息保存至指定文件中;

-ok COMMAND {} \;对每个文件执行指定的命令之前需要用户事先确认;

-exec COMMAND {} \;无需用户确认;

 

find 技巧:

 

时间查找技巧

语法:-mtime  n       Files data was last modified n*24 hours ago.

所以find -mtime 4 是找到所有在距现在96小时之内被修改过的文件或目录。

find -mtime 4 是找到所有5天前4天后被更改的档案文件,

find -mtime -4 是4天内被改的档案,

find -mtime +4 是4+1天,5天后被改的档案。

 

其他技巧

至少一类用户没有的反义是所有用户都有,再取反就ok了,正面难写时就取反,再在个反就得到了

例如:练习题16(至少有一类用户,所以用-,没有执行权限,反过来理解就是有执行权限111,然后用!取反就得到结果了)

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

  方法一:find /etc  \( ! -perm /001 -o ! -perm /010 -o ! -perm/100 \)

 方法二:find /etc ! -perm -111

 

 find –ok 用法,留意这里没有-exec

 find /root/ -name "del.txt" -ok -rm {} \;

 

文件大小查找技巧

 

例:一个文件5556字节,可以这样写

   find /root -size -5557c -size +5555c -exec ls -ld {} \;

   (即查找大于5555字节小于5557字节的文件,以上查找的是/root 目录)

                         

   查找 小于500K,大于50K的文件

   find /root -size -500K -size +50K -exec ls -ld {} \;

                         

   size默认单位是b,而它代表的是512字节,所以2表示1K,1M则是2048,如果不想自己转换,可以使用其他单位,如c、K、M等

   find . -empty 查找当前目录大小为0的文件或空目录

 

 正则匹配实例与技巧

   find path -regex "xxx"

   find path -iregex "xxx"

   这两条命令都是运用base-regexp对文件路径进行匹配,iregex忽略大小写。但是给出的正则表达式必须要匹配完整的文件路径

   比如:find /-regex "find" 这样子是找不到/usr/bin/find的,要像这样find / -regex ".*find"或者更精确一点find / -regex ".*/find"

   如果要使用扩展的正则表达式,对于BSD系的find可以在路径名前加一个"-E"选项

   GNU的find支持多种风格的正则表达式,用-regextype 指定所使用的正则表达式类型,可选的有emacs(默认),posix-awk,posix-basic,posix-egrep,posix-extended,喜欢了grep -E,所以我就用posix-egrep了

find / -regextype "posix-egrep" -regex ".*/find"

find . -exec chown dx:root {}\;改变当前目录下所有文件的权限

find . -cmin -10 查找当前目录下10分钟内被修改过的文件,+10即是10分钟之前


            find、xargs、cp结合使用

            find . -name "*" |xargs cp ???? 

            这里 xargs cp 怎么区分cp源 和 cp目的 

            例:想把 查询到的文件 都copy到/home/users/中去 

                find . -name "*" | xargs cp /home/users/ 

                find . -name "*" | xargs -i cp {} /home/users/ 

            -I 必须指定替换字符 -i 是否指定替换字符-可选 

            例: 

            find . | xargs -I {} cp {} $D_PATH 

            与 

            find . | xargs -i cp {} $D_PATH


            find 和 cp 命令组合

            例:find / -name '*.so*' -exec cp {} /home/ \;