Chinaunix首页 | 论坛 | 博客
  • 博客访问: 94529
  • 博文数量: 21
  • 博客积分: 568
  • 博客等级: 中士
  • 技术积分: 175
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-31 10:29
文章分类
文章存档

2014年(1)

2012年(6)

2011年(14)

我的朋友

分类: LINUX

2011-02-17 15:06:32

find命令是linux下面一个常用的命令,说它简单可以,说它复杂也可以。它有太多的参数,要完全掌握不容易,下面我就做个翻译,并附上范例,写写常用的参数。 一、基础 首先要知道的是,find相当耗io资源,如果不是必要的话,建议用locate代替。 find的命令格式如下: [code] find pathname -options pathname 是要搜索的路径 -options 是可以增加的选项 [/code] 选项包括: [quote]-name 按照文件名查找文件,支持*号和[]号。 -perm 按照文件权限来查找文件,支持完全指定和-号、+号部分符合。 -prune 使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。 -user 按照文件属主来查找文件。 -group 按照文件所属的组来查找文件。 -mtime -n +n 按照文件的更改时间来查找文件 -amin -n +n 按照文件的访问时间来查找文件 -cmin -n +n 按照文件状态的更改时间来查找文件 ※- n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。 -nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。 -nouser 查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。 -newer file1 ! -newer file2 查找更改时间比文件file1新但比文件file2旧的文件。 -type 查找某一类型的文件,诸如:b - 块设备文件。d - 目录。c - 字符设备文件。p - 管道文件。l - 符号链接文件。f - 普通文件。 -size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。 -depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。 -fstype:查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。 -mount:在查找文件时不跨越文件系统mount点。 -follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。 -regex pattern:对搜索结果的[color=#DC143C]整个路径[/color]按正规表达式进行过滤,必须对全路径考虑,例如结果是./test,那正规表达式应该用"./t.*",而不能用"t.*" -cpio:对匹配的文件使用cpio命令。[/quote] 另外,在使用多个参数的时候,find命令还支持使用逻辑运算符: [quote]-a 类似&&,也就是与,当第一个参数运行为真,才运行后面的参数 -o 类似||,也就是或,当第一个运行为假,则运行后面的参数 !,也就是非、否[/quote] 二、样例 [code]$ find ~ -name "*.txt" -print[/code] 查找用户主目录下所有结尾是.txt的文件和目录等 [code]$ find . -type f -perm 644 -print[/code] 显示当前目录下的所有权限是644的普通文件 [code]$ find /var/logs -type f -mtime +7[/code] 显示/var/logs目录下,更改时间在7日前的文件 [code]$ find . -perm -7 -print[/code] 显示当前目录下权限为777的文件和目录等,-7表示用户、主、其他权限中都必须是7。 [quote]-号表示权限要全包含,例如-4,则644、646、446都可以找到,但640就不会显示; +号表示权限可以部分包含,例如+4,则644、644甚至640、404都会显示;[/quote] [code]$ find /apps -path "/apps/bin" -prune -o -print[/code] 显示/apps目录中,除/apps/bin目录的所有文件和目录等;也就是当-path "/apps/bin"找到,则-prune,否则就-print,类似于: [quote]if -path "/usr/sam" then -prune else -print[/quote] [code]find /test \(-path /test/dir1 -o -path /test/file1 \) -prune -o -name "temp" -print[/code] 找/test目录下除了/test/dir1和/test/file1目录外的其他目录中的temp文件和目录等 [code]$ find . -newer httpd1.conf ! -newer temp [/code] 找当前目录下比httpd1.conf新,但比temp旧的文件和目录等 [code]$ find . ! -type d -print[/code] 找当前目录下除目录外的其他文件等(包括设备、链接文件) [code]$ find . -size +1000000c -print[/code] 显示当前目录文件大小超过1M字节的文件 [code]$ find /home/linuxing -size 100c -print[/code] 找/home/linuxing目录下刚好100字节的文件 [code]$ find . -size +10 -print[/code] 找当前目录下超过10个块的文件(1个块默认是512字节) [code]$ find / -name "test" -depth -print[/code] 按先找完起始目录,再进入子目录查找的方式找test文件 [code]$ find . -name "test" -mount -print[/code] 找位于本文件系统上的当前目录中的test文件或目录等(不跨文件系统) [code] $ ls -l total 2 -rw-r--r-- 1 root wheel 0 Dec 28 11:39 001 -rw-r--r-- 1 root wheel 0 Dec 28 11:39 002 -rw-r--r-- 1 root wheel 36 Dec 28 18:05 test $ find . -name "00*" -regex "00.*" $ find . -name "00*" -regex "\./00.*" ./001 ./002 $ find . -name "00*" -regex ".*0." ./001 ./002 [/code] -regex 后面跟的是正规表达式,并且是对包括全路径的结果做过滤 三、配合参数-exec、-ok或xargs find命令可以使用-exec或-ok参数直接对结果执行操作,-exec或-ok后面跟执行的命令,然后是一对儿{},一个空格和一个\,最后是一个分号。 -exec和-ok的区别是-exec是不会咨询用户是否确认的,但-ok会要用户对操作进行每一步的确认。 另外,由于部分系统能否接受的参数是有限制的,但-exec和-ok是把所有的结果作为整套参数传递,这会引起问题。所以也可以使用xargs配合达到同样的目的。在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。 [code]# find . -name "00*" -exec ls -l {} \; -rw-r--r-- 1 root wheel 0 Dec 28 11:39 ./001 -rw-r--r-- 1 root wheel 0 Dec 28 11:39 ./002[/code] 对比上面命令的结果 [code]# find . -name "00*" -ok rm {} \; "rm ./001"? n "rm ./002"? n # find /etc -name "passwd*" -exec grep "linuxing" {} \; linuxing:*:1010:1010:linuxing:/home/linuxing:/bin/bash[/code] 对比-exec和-ok的结果 # find . -type f -name "00*" |xargs file ./001: ASCII text ./002: empty [code]# find . -perm 666 -print | xargs chmod o-w[/code] 再找到本地目录中有666权限的文件或目录等后,把other的w权限去掉 [code]# find /etc -name "passwd*" |xargs grep "linuxing" /etc/passwd:linuxing:*:1010:1010:linuxing:/home/linuxing:/bin/bash[/code] 对比xargs和-exec、-ok的使用方式和结果 四、注意 1、find的后面跟的参数需要注意顺序 因为find的参数之间可以省略-a,也就是说 find . -name "test*" -type f 和 find . -name "test*" -a -type f 是一样的。一旦配合-o等判断的时候,可能会引起难以发现的误会。 例如下面的命令: [code]find /test \(-path /test/dir1 -o -path /test/file1 \) -prune -o -name "temp" -print[/code] 2、find参数不只上述的这些,更多的请man看看。使用好find命令可以简单很多的操作,但同时find也是相当耗费资源的命令,需要慎用。
阅读(680) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~