用于文件精确查找的命令find的使用介绍:

find命令与locate相比,具有以下几个特点:

1.查找精度高,速度略慢;

2.在指定的位置进行文件名或文件属性的遍历扫描;强烈建议不对根目录进行find操作(耗时           长);

3.实时查找;

4.使用find命令只能搜索当前用户具有读取和执行权限的目录;


find命令:

find - search for files in a directory hierarchy

find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]

  [-H] [-L] [-P] [-D debugopts]:选项一般不怎么用。

[path...]:默认为当前工作目录,可以指定具体的目录路径;

[expression]:进行本次搜索的标准,可以是文件名、文件大小、文件类型、文件                               权限等等;默认是指定目录中的所有文件;


总的来说,find就是根据文件的各种特性来查找我们所需的文件的。

我们可根据文件名、inode编号、正则表达式、属主与属组、类型、时间戳、大小、组合条件、权限等。


下面我们就来开始举例说明

1.根据文件名查找:

-name 文件名称,支持使用Globbing,(*, ?, [], [^])

-iname 文件名称,忽略字母大小写,支持使用Globbing,(*, ?, [], [^])

 

   例:在/etc目录下找出文件名为hosts的文件。     

[root@localhost ~]# find /etc -name hosts
/etc/hosts
/etc/avahi/hosts


2.根据文件的inode编号查找:

-inum inode编号:通过给定的inode编号查找对应的文件名及路径;

-samefile name:通过给定的文件名查找对应的inode编号,进而确定所有具有该inode编号的文件名及路径;

-links n:查找链接数为n的所有文件;

例:在/etc目录下找出链接数为7的文件。        

[root@localhost ~]# find /etc -links 7
/etc/polkit-1/localauthority
/etc/gconf
/etc/dconf/db
/etc/NetworkManager


3.根据正则表达式查找:

-regex pattern:以pattern匹配整个文件路径字符串,而不仅仅是给定文件的名称;

            

4.根据文件的属主和属组进行查找:

-user uname:根据属主为指定用户的用户名进行查找

-uid UID:根据属主为某个UID进行查找

-group gname:

-gid GID:

-nogroup:在文件的属组上没有组对应的组名;

-nouser:在文件的属主上没有用户对应的用户名;


例:查找/var目录下属主为root且属组为mail的所有文件;

[root@localhost ~]# find /var -user root -group mail
/var/spool/mail
/var/spool/mail/root

查找/usr目录下不属于root、bin等用户的文件;

[root@localhost ~]# find /tmp -not -user root ! -user bin

查找当前系统上没有属主或属组的文件

[root@localhost ~]# find / -nouser -o -nogroup


5.根据文件的类型查找:

-type 文件类型:

b:块设备

c:字符设备

d:目录文件

f:普通文件

l:符号链接文件

p:管道文件

s:套接字文件

-xtype 文件类型:符号链接文件的匹配需要配合其他的选项;

例:查找/dev下的套接字文件。

[root@localhost ~]# find /dev -type s
/dev/log


6.根据时间戳进行查找:

以天为单位:

-atime [+|-]n:根据访问时间查找

-ctime [+|-]n:根据改变时间查找

-mtime [+|-]n:根据修改时间查找

n:[n,n+1)

+n:[n+1,+∞)

-n:[now,n)

以分钟为单位:

-amin [+|-]n

-cmin [+|-]n

-mmin [+|-]n


例:查找/tmp目录下最近3天内文件访问过且不属于root用户的文件;

[root@localhost ~]# find /tmp -atime -3 -not -user root


7.根据文件的大小进行查找:

-size [+|-]n[cwbkMG]

n:(n-1,n]

-n:[0,n-1]

+n:(n,+∞)


例:

find -size +2k

当前目录下所有大于2KB的文件;

find -size 2k

当前目录下所有1KB-2KB之间的文件;

find -size -2k

当前目录下所有小于1KB的文件;


8.组合条件:

-a:逻辑与,默认可以省略;

-o:逻辑或

-not, !:逻辑非


逻辑组合条件遵循德摩根定律:

非(A 与 B) == 非A 或 非B

非(A 或 B) == 非A 与 非B


例:在/tmp目录下查找属主为root或sbin且在前第三至第四天被修改过的文件。

[root@localhost ~]# find /tmp \( -user root -o -user ftp \) -mtime 2


9.根据权限查找:

-perm [/|-]mode

mode:精确匹配指定的权限

/mode:隐含了逻辑或的关系,任何一个权限位的权限中只要能有一个权限匹配,即可满足条件;

-mode:隐含了逻辑与的关系,每一个权限位的权限中都必须同时包含指定权限位,才能满足条件;

例:查找/etc目录下所有用户都没有写权限的文件,并显示出其详细信息;

[root@localhost ~]# find /etc -not -perm /222 -ls

查找/etc目录下至少有一个权限位中没有写权限的文件;

[root@localhost ~]# find /etc -not -perm -222


在找出了符合我们所要求的文件之后,我们还可能对这些文件做一些相关的操作。下面我们就来看看如何执行这些操作。

操作处理:

-print:输出到显示屏幕,默认的动作;

-ls:对与查找到的结果执行ls -li命令显示;

-exec COMMAND {} \;:

-ok COMMAND {} \;:

对于查找到的结果执行COMMAND命令;

区别:

-exec是非交互式的;

-ok是交互式的;

{}:占位符,用来引用被find命令查找到的所有的文件的路径信息;


-exec和-ok的取代执行操作:

chmod a-r $(find -perm -444 -type f)

find -perm -444 -type f | xargs chmod a-r

注意:管道输送的是纯字符串信息,所以如果管道之后的命令不是处理字符串的命令,需要使用xargs命令将其转换成能够被后面命令处理的参数;


例:在/tmp目录下查找属主为root的文件并复制到/etc目录下

[root@localhost ~]# find /tmp -user root -exec cp {} /etc \;