Linux基础知识之find命令的用法

                           Linux基础知识之find命令的用法

对文件名进行精确查找的命令----find
Find命令的格式:

   # find [patn..] [expression]

但是我们按以下方法写会容易理解:
# find [查找路径] [查找标准] [处理动作]
其中[ ]中的内容是可以省略的,若省略查找目录,则默认的路径就是当前目录
                             若省略查找标准,则默认为指定路径下的所有文件
                             若省略处理动作:则默认为显示到屏幕上
查找路径:即在哪个路径目录下查找所需要的文件
查找标准:即通过什么方式来查找(或叫匹配)文件名,是根据选项(options)来指定的,例如-name、-type、-regex等
处理动作:即找到文件后该怎么办,例如-ls、-ok、-exec等
 
 
查找(匹配)标准:
根据文件的名称来查找:
  -name ‘FILENAME':即对文件名作精确匹配,在对文件名匹配的时候还可以用文件名通配进行匹配操作
             文件名的通配符:
                  * :表示任意长度的任意字符
                  ?:表示任意单个字符
                  []:表示任意范围内的单个字符
例如# find /etc -name 'passwd'   表示查找在/etc目录下,文件名为passwd的文件
 
# find /etc -name 'passwd*' 表示查找在/etc目录下,文件名以passwd开头,后跟任意长度任意字符的文件
# find /etc -name '*passwd*'  表示查找在/etc目录下,文件名中含有passwd这个字符串的文件
        
需要注意的是若用-name做文件名匹配的时候,是严格区分大小写来查找的
 
-iname ’FILENAME':根据匹配文件名不区分大小写
 
根据基础正则表达式来查找:
-regex PATTERN:基于基础正则表达式的模式对文件名进行查找,因为我们并没有指定-regex的type,所以默认的是基础正则表达式
        
根据文件的属性来查找:
-user USERNAME:根据文件的属主进行查找
        例如# find /tmp/hadoop -user student查找属主是student的文件在/tmp/hadoop文件下
        
-group GROUPNAME:根据文件的属组进行查找
        
-uid UID:根据文件的属主号进行查找 它的意义在于:一旦文件的属主用户被删掉了,则此时文件属主号会变为该用户之前的UID号,此时就必须用UID号进行查找
-gid GID:根据文件的属组号进行查找 意义同上
        

-nouser: 查找没有属主的文件    它的应用意义在于:帮助管理员定期查看哪个文件是没有属主,并回收这些文件,以防至其他用户通过此文件攻击系统

-nogroup:查看没有属组的文件
 
根据文件的类型来查找:     
-type:根据文件的类型来查找,文件类型分为很多种,如普通文件,目录文件,字符设备文件,块设备文件,连接文件文件,管道文件,套接字文件如下所示:
                 f:普通文件
                 d:目录文件
                 c:字符文件
                 b:块文件
                 l:连接文件
                 p:管道文件
                 s:套接字文件
例如查看tmp下的目录
# find /tmp -type d
# find /tmp -type c
 
根据文件的大小来查找:

-size  [+|-]#[kMG]:根据文件的大小来查找,这里#用数字替代          

#k:按照KB的大小来匹配文件,#表示数字虽然它的含义似乎精确匹配#k的文件,但实际上匹配到的文件都是离#最近的,因此所有小于#k和#k的文件都认为是#k所匹配的文件         

#M:按照M的大小来匹配文件          

#G:按照G的大小来匹配文件              

       [+|-]#k :+#k是查找大于#k的文件;-#k是查找小于#k的文件

       例如# find  /etc -size 10M   (这里必须是find  后面跟路径)                

扩展知识:一次性完成多个条件的查找,这时我们用组合条件
组合条件:这里同if条件语句的组合条件是相通的
                        -a  :代表“与”条件
                        -o  :代表“或”条件
                      -not  :代表“非”条件
        这里需要注意的是:-a的优先级是大于-o的
        若给出两个条件但是没有指出他们的连接条件的话,默认为他们之间是“与”关系

例如 # find /etc -type d -size 10k  查找类型是d  并且是10k大小的文件在/etc下

 
 
练习
/tmp目录下,查找不是目录类型,而且还不能是套接字类型的文件

    # find /tmp -not -file d -not -type s

/tmp/test目录下,查找属主不是user1,也不是user2的文件:   

       # find /tmp/test -not -user user1 -a -not user2 或  # find /tmp/test -not \(-user user1 –o -user user2 \)

摩根定律:
 
 
 
还能根据文件的时间戳来查找:

     -mtime [+|-]#:根据修改时间来查找文件  #表示时间,一般单位是天

     -ctime [+|-]# :根据改变时间

     -atime [+|-]# :根据访问时间

以-atime [+|-]# 为例  -atime -5:表示查找离现在起#天内被访问过的文件                                         -atime +5:表示查找至少有5天没有被访问过的文件,既#天之前曾访问过的文件                

                       -atime 5: 表示离现在正好5天,曾访问过       

     -amin [+|-]# :表示分钟,其他的跟上面相同    

     -cmin [+|-]#    

     -amin [+|-]#            

根据文件的权限来查找:

-perm [+|/]MODE:根据文件的权限来查找,其中MODE表示文件的权限,一般换算为数值,例如644,777等        这里要注意的是:直接用-perm MODE(既权限):是精确MODE匹配查找 

 -perm -MODE :表示查找只有文件权限能完全包含此MODE时才能显示    

 -perm /MODE :表示要查找的文件9位权限中但凡有一位符合就可以被找到

    find ./ -perm -001 其他人有执行权限

    find ./ -perm -022 组有写权限,其他人也有写权限     
      
 
  
find的处理动作:  
-print:显示出来即默认的形式         
- ls:类似ls -l的形式,既显示每一个文件的详细信息    
      
 其他的处理动作如:
 -ok COMMAND {} \;    :-ok后面跟平时执行的命令,如果后有文件,则用{}表示文件名称占位符,最后必须以\;结束。否则会被认为是语法错误,-ok命令每一个操作都需要用户去确认,这是与-exec不同的地方。
-exec COMMAND {} \;    用法同-ok一样,只是不用询问用户
 
         
找到类型是目录的文件,并且让此文件属主属组都有执行权限    
# find ./ -type d -ok chmod +x {} \;     注意:这里的{}就代表被查找到的文件名
 
找到文件权限包含020的所有文件,并且把这些文件重命名为“原来的名字后跟.new”
# find ./ -perm -020 -exec mv {} {}.new \;
   
练习  
1,查找/var目录下属主为root并且属组为mail的所有文件:
find /var -user root -a -group mail   
2、查找/usr目录下不属于root,bin,或student的文件;

find /usr -not -user root -a -not -user bin -a -user student

3查找/etc目录下最近一周内内容修改过且不属于root及student用户的文件;

find /etc -mtime -7 -a -not -user root -a -not -user student find /etc -mtime -7 -not\( -user root -o -not -user student\)

4查找当前系统上没有属主或属组且最近1天内曾被访问过的文件,并将其属主属组均修改为root

find / \(-nouser -o -nogroup\) -a -atime -1 -exec chown root:root {} \;

5查找/etc目录下大于1M的文件,并将其文件名写入/tmp/etc.largefiles文件中
find /etc -size +1M >> /tmp/etc.largefiles
6查找/etc目录下所有用户都没有写权限的文件,显示出其详细信息;
find /etc -not -perm /222 -exec ls -l \;

你可能感兴趣的:(linux,find命令,linux基础知识)