2012年(14)
分类: LINUX
2012-06-29 11:03:52
语法格式如下
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 "{} \;" 在后面加上引号,单引号、双引号都可以!