1.find vs locate

在实际中,我们经常需要查找到一些特定文件,然后进行处理,LINUX提供了locate , find这两个命令用于文件查找。

a.locate,非实时查找,非精确查找。linux会定期生成更新文件数据库,而locate将根据文件数据库进行查找。我们可以在使用locate命令前,更新文件数据库,使用updatedb即可。但是updatedb将会花费可能半天时间,SO LONG!


b.find , 实时查找,精确查找。根据指定路径,查找标准,进行文件遍历(包括隐藏文件和子目录)。


c. 显然,locate除了快些,相比find没什么优点。因此,实际中,我们查找文件首选find~


2.How to use find?

find 路径  标准  动作

说明:

关于路径:

我们可以不给,那么就是当前路径。


关于标准:

要知道find查找文件,支持众多标准,比如文件名精确匹配查找,权限,大小,正则等等。


关于动作:

定义查找到文件后可以发生哪些动作。默认的行为就是显示到屏幕上。



3.Some examples about find

实例一:-name 与 globbing

[root@localhost ~]# find . -name "*.sh"
./manageuser.sh
./13.sh
./17.sh
./25.sh
./mytask.sh

注意,-name表示根据文件名称进行精确匹配查找,支持文件名通配,即globbing。

【回顾下globbig,有*,?,[]等】

如果,我们不想区分大小写,可以-iname。


实例二:-user 与 -group , -uid 与 -gid

[root@localhost ~]# find /etc -uid 501
[root@localhost ~]# find /etc -user root

注意,-user,-group分别表示根据文件的属主,属组名称进行查找;-uid,-gid表示根据文件的uid,gid进行查找。那么它们有什么区别呢?


假设,file1的owner是zhangfengzhe,uid是550,如果userdel -r zhangfengzhe,那么文件file1怎么办?它将属于谁呢?

484299    4 ---xrwx--x   1 550      root            0 May 16 15:08 ./file1

可以看到,文件的属主将是uid,就是表示文件已经没有属主了。


可以利用-nouser,-nogroup查找没有属主,属组的文件。


事实上,我们应该定期利用-nouser查找没有属主的文件,然后交给root用户,以防止其他用户趁虚而入!


实例三:-type 'TYPE'

[root@localhost ~]# find -type d
.
./.gconf
./.gconf/desktop
./.gconf/desktop/gnome

注意,-type表示根据文件类型进行查找。LINUX的文件类型常见的有:

f(file),d(directory),l(linked file),s(socket file),p(pipe file),c(character),b(block)


实例四:-size [+-]Number[k/M/G...]

[root@localhost ~]# find /etc -size +1M 

/etc/selinux/targeted/policy/policy.21

/etc/selinux/targeted/modules/active/base.pp

/etc/selinux/targeted/modules/active/base.linked

/etc/selinux/targeted/modules/active/policy.kern

/etc/gconf/schemas/apps_nautilus_preferences.schemas

/etc/gconf/schemas/metacity.schemas

/etc/gconf/schemas/gnome-terminal.schemas

/etc/gconf/schemas/gok.schemas

/etc/gconf/gconf.xml.defaults/%gconf-tree.xml


注意:

-size 2M 表示的是查找[1M,2M],并不是说查找等于2M的文件

-size +1K 表示查找大于1K的文件,很显然-表示小于


实例五:-atime -ctime -mtime -amin -cmin -mmin

[root@localhost ~]# find /etc -atime +7

注意,我们知道文件有3个timestamp:access,change,modify

-atime 7 表示在7天之前访问过的文件

-ctime -3 表示在3天之内修改过的文件

-amin -10 表示10分钟之内访问过的文件


这些有时候非常有用,比如,我们的WEB服务器突然异常了,可能是由于配置文件发生了修改导致的,那么我们就可以查下最近一段时间哪些文件发生了修改。

其实除了上面的,还有-perm MODE来根据权限来查找。我这里就不介绍了,大家自学成才吧~另外,我们可以使用-a,-o,not进行条件组合。默认就是-a。


4.Action for find

当我们找到特定文件后,就可以进行ACTION处理,使用-ok,-exec,xargs即可。格式如下:

find yourpath yourpattern -ok COMMAND \;

find yourpath yourpattern -exec COMMAND \;

find yourpath yourpattern | xargs COMMAND ;

注意,对于-ok,-exec而言,必须注意\;,否则语法错误。

在-ok,-exec的COMMAND中,可以使用{}进行文件名引用。

-ok与-exec的区别在于,-ok需要询问,-exec不需要。

xargs需要以管道的方式进行处理。

实例:

find /etc -size +1M | xargs echo {} >> yourfile;
find -name '*.sh' -exec cp {} {}.bak \;


5.小结

专家都从菜鸟来,原来find如此easy~