用find进行高级搜索

基于目录深度的搜索

find命令在使用时会遍历所有子目录,我们可以采用一些参数来限制find命令遍历的深度,-maxdepth和-mindepth就是这类参数

只需要搜索当前目录和当前目录的一级子目录

[root@mio-test bin]# find /etc/ -maxdepth 2 -name '*.sh'
/etc/profile.d/colorls.sh
/etc/profile.d/less.sh
/etc/profile.d/glib2.sh
/etc/profile.d/which2.sh
/etc/profile.d/lang.sh
/etc/bash_completion.d/gsettings-bash-completion.sh
/etc/bash_completion.d/gdbus-bash-completion.sh

只搜索当前目录二级子目录之后的文件

[root@mio-test bin]# find /etc/ -mindepth 2 -name '*.sh'
/etc/dhcp/dhclient.d/ntp.sh
/etc/profile.d/colorls.sh
/etc/profile.d/less.sh
/etc/profile.d/glib2.sh
/etc/profile.d/which2.sh
/etc/profile.d/lang.sh
/etc/X11/xinit/xinitrc.d/00-start-message-bus.sh
/etc/X11/xinit/xinitrc.d/50-xinput.sh
/etc/X11/xinit/xinitrc.d/localuser.sh
/etc/kde/env/imsettings-kde.sh
/etc/bash_completion.d/gsettings-bash-completion.sh
/etc/bash_completion.d/gdbus-bash-completion.sh

根据文件类型的搜索

类UNIX系统将一切都视为文件,文件有不同的类型,例如普通文件,目录,字符设备,块设备,符号链接,硬链接,套接字以及FIFO等

-type则可以对文件搜索进行过滤,只查找我们指定的文件类型

type参数 支持的类型有下面几种

 

普通文件    f

符号链接    l

目录            d

字符设备    c

块设备        b

套接字        s

fifo              p

搜索块设备

[root@mio-test Vendor]# find /  -type b
find: `/proc/15466/task/15466/fd/5': No such file or directory
find: `/proc/15466/task/15466/fdinfo/5': No such file or directory
find: `/proc/15466/fd/5': No such file or directory
find: `/proc/15466/fdinfo/5': No such file or directory
/dev/ram9
/dev/ram8
/dev/ram7
…

根据文件时间进行搜索

UNIX/Linux文件系统中的每一个文件都有三种时间戳

访问时间(-atime) 用户最近一次访问文件的时间

修改时间(-mtime) 文件内容最后一次被修改的时间

变化时间(-ctime) 文件元数据,最后一次被修改的时间

显示当前搜索目录最近一周被访问过的文件

[root@mio-test Vendor]# find /root/ -maxdepth 1 -type f -atime -7
/root/.bash_logout
/root/.bash_history
/root/.bashrc
/root/.bash_profile
/root/php-5.3.29.tar.gz
/root/1.sh

基于文件大小的搜索

-size可以指定搜索的文件大小

支持的文件大小单元有:

b 块(512字节)

c 字节

w 字(2字节)

k KB

m MB

g GB

显示大于1M的文件

[root@mio-test ~]# find -type f -size +1M
./php-5.3.29/configure
./php-5.3.29/pear/install-pear-nozlib.phar
./php-5.3.29/ext/fileinfo/data_file.c
./php-5.3.29/ext/sqlite3/libsqlite/sqlite3.c
./php-5.3.29/ext/date/lib/timezonedb.h
./php-5.3.29/Zend/zend_vm_execute.h
./php-5.3.29.tar.gz

删除匹配的文件

-delete 可以用来删除find查找到的文件

删除/tmp/下后缀为log的文件

[root@mio-test ~]# find /tmp/ -name '*.log'
/tmp/yum.log
[root@mio-test ~]# find /tmp/ -name '*.log' -delete
[root@mio-test ~]# find /tmp/ -name '*.log'
[root@mio-test ~]#

基于文件权限和所有权的搜索

-perm 可以指定文件的权限

查找/home/目录下权限为777的文件

[root@mio-test home]# find /home/ -perm 777
/home/logs
/home/logs/monitor
/home/logs/monitor/Order
…

-user可以指定文件的属主

查找/home/test/下属主为nobody的文件

find /home/test/ -user ‘nobody’

结合find执行命令或操作

find命令可以借助选项-exec与其他命令进行结合

在-exec选项中 {}是一个特殊的标识,被查找到的文件会替换{},然后做为命令的一部分执行

查找出/tmp/目录下的所有文件,将这些文件的属主设置为nobody

[root@mio-test home]# find /tmp/ -name '*' -exec chown nobody {} \;
[root@mio-test home]# ll /tmp/
total 64
-rw-------  1 nobody nobody  7044 Aug  7 15:04 wrtGXAfmG
-rw-------  1 nobody nobody 12321 Aug  7 16:55 wrtiYcQqu
-rw-------  1 nobody nobody  5530 Aug  7 15:04 wrtmvj48M
-rw-------  1 nobody nobody  7042 Aug  7 15:02 wrtmXzLzs
-rw-------  1 nobody nobody  5292 Aug  7 16:55 wrtUSESTM
-rw-------  1 nobody nobody  5534 Aug  7 15:02 wrtuXF8Sv
-rw-------. 1 nobody root    4138 Aug  7 09:47 yum_save_tx-2014-08-07-09-47Hr4LpX.yumtx

排除条件

在搜索目录并执行某些操作的时候,有时为了提高性能,需要跳过一些目录或文件

搜索/root/的当前目录,排除后缀为log的文件

[root@mio-test ~]# find /root/ -maxdepth 1 \( -name '*.log' -prune -o -name '*' \)
/root/
/root/anaconda-ks.cfg
/root/.pki
/root/.bash_logout
/root/.bash_history
/root/.bashrc
…

搜索/root/的sh文件,排除掉 php-5,3,29  这个目录

[root@mio-test ~]# find /root/ \( -name 'php-5.3.29' -prune -o -name '*.sh' \)
/root/php-5.3.29
/root/own.sh
/root/1.sh