Chinaunix首页 | 论坛 | 博客
  • 博客访问: 63988
  • 博文数量: 14
  • 博客积分: 306
  • 博客等级: 二等列兵
  • 技术积分: 135
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-24 15:02
文章分类
文章存档

2012年(14)

我的朋友

分类: LINUX

2012-06-29 11:03:52

find 是最常见和最强大的查找命令,你可以用它找到任何你想找的文件。

语法格式如下
find <指定目录> <指定条件> <指定动作>

一般的参数

-name filename 按照文件名查找文件
-size [+-]SIZE 找比SIZE还要大(+)或小(-)的文件。这个SIZE的格式有:
c: 代表 byte,k: 代表 1024bytes。
所以,要找比50KB还要大的文件,就是用-size +50k
-type 查找某一类型的文件(b、d、c、p、l等等文件类型)
-newer file :file为一个存在的档案,列出比file文件还要新的文件
-depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找
-prune 使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略

权限相关的参数

-perm mode 查找权限为mode(数字表示的权限)的文件
-perm -mode 查找权限全部包括mode(数字表示的权限)的文件。找到的文件权限比参考权限(mode)要大
-perm +mode 查找包含任一mode(数字表示的权限)的文件.找到的文件权限比参考权限(mode)要小

用户和组相关的参数

-user username :按照文件所有者来查找文件
-uid n :按照文件所有者的UID来查找文件
-group groupname :按照文件所属的组来查找文件
-gid n :按照文件所属组的GID来查找文件
-nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在
-nouser 查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在

和时间相关的参数

共有 -atime, -ctime 与 -mtime ,以-mtime说明,其他两个也一样
-mtime n :n为数字,意义为在n天之前(n当天)被更动过内容的文件
-mtime +n :列出在n天之前(不含n天本身)被更动过内容的文件名
-mtime -n :列出在n天之内(含n天本身)被更动过内容的文件名
-n表示文件更改时间距现在n天以内
+n表示文件更改时间距现在n天以前
n表示文件更改的当天
可以看下图,更好的帮助大家来理解

如将系统上面24小时内有更动过内容(mtime)的文件列出
find / -mtime 0
那个0是重点,0代表目前的时间,所以,从现在开始到 24 小时前。

后续的动作参数

-exec command :command为其他指令,-exec后面可再接额外的命令来处理查找到的结果。
exec选项后面的格式:所要执行的命令或脚本+一对”{}”+”一个空格”+一个”\”+一个分号”;”。
最后的样式:-exec command {} \;
注:
1、{} 代表的是由find找到的内容,结果会被放置到{}中
2、-exec一直到\;是关键词。代表find额外动作的开始(-exec)到结束(\;),在这中间的就是find指令内的额外动作
3、因为”;”在bash环境下是有特殊意义,因此利用反斜杠来转义

下面看几个例子
1、查找/etc目录下的所有文件,并用ls -l把他们列出来
[root@yufei ~]# find /etc/ -type f -exec ls -l {} \;

2、在/var/log/目录中查找更改时间在5日以前的文件并删除它们
[root@yufei ~]# find /var/log/ -type f -mtime +5 -exec rm {} \;

如果你要进行这项操作的话,为了安全,建议先用ls再用rm,如果你确认没有问题的话,当然完全没有问题,用什么命令都可以。当然,也有一个确认的功能,下面就来看看这个-ok
3、在/var/log/目录中查找所有以.log结尾的文件名、更改时间在5日以上的,并删除它们,但在删除之前先给出提示。
[root@yufei ~]# find /var/log/ -name ‘*.log’ -mtime +5 -ok rm {} \;

这时候,如果找到了符合的文件,就会给出删除提示,按y键删除文件,按n键不删除。
4、查找所有的passwd文件,看看在这些文件中是否存在一个某个用户
[root@yufei ~]# find /etc -name “passwd*” -exec grep “” {} \;

5、找出/etc底下,文件大小介于50K 到 60K 之间的文件,并将权限完整的列出
[root@yufei ~]# find /etc -size +50k -a -size -60k -exec ls -l {} \;

那个 -a 是 and的意思,为符合两者才符合
6、找出 /etc 底下,容量大于1500K 以及容量等于0的文件
[root@yufei ~]# find /etc -size +1500k -o -size 0
相对于-a ,那个 -o 就是或 (or)的意思

7,find mv移动方法
find   .  -name "*mail,*" -type f -atime +30 -exec mv {} ../75/. \;

 

xargs

在使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是”参数列太长”或”参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。

看几个例子
1、查找/tmp目录下,名字为core的文件,并将其删除
[root@yufei ~]# find /tmp -name core -type f -print | xargs /bin/rm -f

2、在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限
[root@yufei ~]# find . -perm -7 -print | xargs chmod o-w

3、用grep命令在所有的普通文件中搜索hostname这个词
[root@yufei ~]# find / -type f -print | xargs grep “hostname”
[root@yufei ~]# find / -name \* -type f -print | xargs grep “hostnames”



其实这两个命令是一样的意思。和前面我们讲的一样,反斜杠”\”用来取消find命令中的*在shell中的特殊含义。

通过上面的一些例子,find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。而且在find的帮助文件中也有相应的帮助说明。大家可以参考学习。

二、在文件中搜索关键词

grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
由于正则表达式我们还没有学习,在这里只做简单的介绍几个例子,来让大家了解一下grep。
1、在/etc/passwd中查找yufei用户的相关信息
[root@yufei ~]# grep yufei /etc/passwd
yufei:x:500:500:yufei:/home/yufei:/bin/bash



2、查看系统日志/var/log/message文件,并查找2月12号的日志内容
[root@yufei ~]# cat /var/log/messages |grep ‘Feb 12′ |more

这个例子我们用到了管理符号,翻页命令

Linux下find命令实例
$find    ~    -name    "*.txt"    -print      #在$HOME中查.txt文件并显示
$find    .     -name    "*.txt"    -print
$find    .     -name    "[A-Z]*"    -pri26nbsp;     #对匹配的文件使用cpio命令,将他们备份到磁带设备中-prune                                #忽略某个目录
$find    .     -name    "[A-Z]*"    -print    #查以大写字母开头的文件
$find    /etc    -name    "host*"    -print #查以host开头的文件
$find    .    -name    "[a-z][a-z][0--9][0--9].txt"     -print    #查以两个小写字母和两个数字开头的txt文件
$find .    -perm    755    -print
$find    .    -perm -007    -exec ls -l {} \;    #查所有用户都可读写执行的文件同-perm 777
$find    . -type d    -print   打印目录结构
$find    .   !    -type    d    -print  打印非目录文件
find /usr/include -name '*.h' -exec grep AF_INEF6 {} \;
因grep无法递归搜索子目录,故可以和find相结合使用。 在/usr/include 所有子目录中的.h文件中找字串AF_INEF6

$find    .    -type l    -print
$find    .    -size    +1000000c    -print         #查长度大于1Mb的文件
$find    .    -size    100c          -print        # 查长度为100c的文件
$find    .    -size    +10    -print               #查长度超过期作废10块的文件(1块=512字节)
$cd /
$find    etc    home    apps     -depth    -print    | cpio    -ivcdC65536    -o    /dev/rmt0
$find    /etc -name "passwd*"    -exec grep    "cnscn"    {}    \;    #看是否存在cnscn用户
$find . -name "yao*"    | xargs file
$find    . -name "yao*"    |    xargs    echo     "" > /tmp/core.log
$find    . -name "yao*"    | xargs    chmod    o-w


find    -name april*                        在当前目录下查找以april开始的文件
find    -name    april*    fprint file          在当前目录下查找以april开始的文件,并把结果输出到file中
find    -name ap* -o -name may*    查找以ap或may开头的文件
find    /mnt    -name tom.txt    -ftype vfat    在/mnt下查找名称为tom.txt且文件系统类型为vfat的文件
find    /mnt    -name t.txt ! -ftype vfat     在/mnt下查找名称为tom.txt且文件系统类型不为vfat的文件
find    /tmp    -name wa* -type l             在/tmp下查找名为wa开头且类型为符号链接的文件
find    /home    -mtime    -2                   在/home下查最近两天内改动过的文件
find /home     -atime -1                    查1天之内被存取过的文件
find /home -mmin     +60                    在/home下查60分钟前改动过的文件
find /home    -amin    +30                    查最近30分钟前被存取过的文件
find /home    -newer    tmp.txt               在/home下查更新时间比tmp.txt近的文件或目录
find /home    -anewer    tmp.txt              在/home下查存取时间比tmp.txt近的文件或目录
find    /home    -used    -2                    列出文件或目录被改动过之后,在2日内被存取过的文件或目录
find    /home    -user cnscn                  列出/home目录内属于用户cnscn的文件或目录
find    /home    -uid    +501                   列出/home目录内用户的识别码大于501的文件或目录
find    /home    -group    cnscn                列出/home内组为cnscn的文件或目录
find    /home    -gid 501                     列出/home内组id为501的文件或目录
find    /home    -nouser                      列出/home内不属于本地用户的文件或目录
find    /home    -nogroup                     列出/home内不属于本地组的文件或目录
find    /home     -name tmp.txt     -maxdepth    4    列出/home内的tmp.txt 查时深度最多为3层
find    /home    -name tmp.txt    -mindepth    3    从第2层开始查
find    /home    -empty                       查找大小为0的文件或空目录
find    /home    -size    +512k                 查大于512k的文件
find    /home    -size    -512k                 查小于512k的文件
find    /home    -links    +2                   查硬连接数大于2的文件或目录
find    /home    -perm    0700                  查权限为700的文件或目录
find    /tmp    -name tmp.txt    -exec cat {} \;
find    /tmp    -name    tmp.txt    -ok    rm {} \;
find     /    -amin     -10         # 查找在系统中最后10分钟访问的文件
find     /    -atime    -2           # 查找在系统中最后48小时访问的文件
find     /    -empty                # 查找在系统中为空的文件或者文件夹
find     /    -group    cat          # 查找在系统中属于 groupcat的文件
find     /    -mmin    -5           # 查找在系统中最后5分钟里修改过的文件
find     /    -mtime    -1          #查找在系统中最后24小时里修改过的文件
find     /    -nouser               #查找在系统中属于作废用户的文件
find     /    -user     fred         #查找在系统中属于FRED这个用户的文件

查当前目录下的所有普通文件
# find . -type f -exec ls -l {} \;
-rw-r--r--      1 root       root          34928 2003-02-25    ./conf/httpd.conf
-rw-r--r--      1 root       root          12959 2003-02-25    ./conf/magic
-rw-r--r--      1 root       root            180 2003-02-25    ./conf.d/README
查当前目录下的所有普通文件,并在- e x e c选项中使用ls -l命令将它们列出

在/logs目录中查找更改时间在5日以前的文件并删除它们:
$ find logs -type f -mtime +5 -exec    -ok    rm {} \;

查询当天修改过的文件
[root@book class]# find    ./    -mtime    -1    -type f    -exec    ls -l    {} \;

查询文件并询问是否要显示
[root@book class]# find    ./    -mtime    -1    -type f    -ok    ls -l    {} \; 
< ls ... ./classDB.inc.php > ? y
-rw-r--r--      1 cnscn      cnscn         13709    1月 12 12:22 ./classDB.inc.php
[root@book class]# find    ./    -mtime    -1    -type f    -ok    ls -l    {} \; 
< ls ... ./classDB.inc.php > ? n

find -exec 这个命令组合很好用,在find命令后加上 -exec,就可以把找出来的东西进行操作。

之前写过一篇Linux命令:find与exec参数的用法

#find ./ -name Thumbs.db -exec rm -f {} \; 查找本目录下所有的Thumbs.db并删除

但有的linux系统下会提示错误信息:find: 遗漏“-exec”的参数

解决办法:

#find ./ -name Thumbs.db -exec rm -f "{} \;" 在后面加上引号,单引号、双引号都可以!




阅读(2875) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~