查找技巧,find及xargs的使用

来源:互联网 发布:linux自动启动服务 编辑:程序博客网 时间:2024/04/29 03:59

find 命令的一般形式为:

find pathname -options [-print -exec -ok]

如下为该命令的参数:

pathname:find命令所查找的目录路径。例如用.來表示当前目录,用/來表示系统根目录。

-print: find命令将匹配的文件输出到标准输出。

-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应的形式为‘command‘ {} \,最后还要跟上一个;。

注意{}和\之间的空格不能少。

-ok: 和-exec的作用相同,只不过以一种更为安全的模式來执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户來确定是否执行。


find命令选项:

-name: 按照文件名查找文件。

-perm: 按照文件权限查找文件。

-prune: 使用这一选项可以是find命令不再当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。

-user: 按照文件属主來查找文件。

-group:按照文件所属的组來查找文件。

-mtime -n +n: 按照文件的更改时间來查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime选项,但它们都和-mtime选项。

-nogroup:查找五有效所属组的文件,即该文件所属的组在/etc/groups中不存在。

-nouser:查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。

-newer file1 !file2:查找更改时间比文件file1新但比文件file2旧的文件。

-type:查找某一类型的文件,诸如:

b - 块设备文件。d - 目录。c - 字符设备文件。p - 管道文件。l - 符号链接文件。f - 普通文件按。

-size [+-]n[c]:查找文件长度为n块的文件,带有c时表示文件长度以字节计。+、-表示文件长度大于、小于n

-depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。

-maxdepth n:在查找目录中最大查找n层。

-mindepth n:在查找目录中最小查找n层。

-fstype:查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了奔系统中有关文件按系统的信息。


-mount:在查找文件是不跨越文件系统mount点。

-follow:如果find命令遇到字符链接文件,就跟踪至链接所指向的文件。

-cpio:对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。


例:

$ find . -type f -exec ls -l {} \;

$ find . -name "*.conf" -mtime +5 -ok rm {} \;

xargs

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

这就是xargs命令的用处所在,特别是与find命令一起使用。

find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不髙;

而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有参数,还是分批获取参数,以及每一次获取参数的数目都会根据命令的选项及系统内核中相应的可调参数來确定。

例:

$ find . -type f -print | xargs file

忽略某个目录

如果在查找文件时希望忽略某个目录,因为你知道那个目录中没有你所要查找的文件,那么可以使用- p r u n e选项来指出需要忽略的目录。在使用- p r u n e选项时要当心,因为如果你同时使用了- d e p t h选项,那么- p r u n e选项就会被f i n d命令忽略。

如果希望在/ a p p s目录下查找文件,但不希望在/ a p p s / b i n目录下查找,可以用:
  1. $ find /apps -path "/apps/bin" -prune -o -print
复制代码


使用find查找文件的时候怎么避开某个文件目录

比如要在/usr/sam目录下查找不在dir1子目录之内的所有文件

  1. find /usr/sam -path "/usr/sam/dir1" -prune -o -print  
复制代码



QUOTE:
find [path ..] [expression] 在路径列表的后面的是表达式
-path "/usr/sam" -prune -o -print 是 -path "/usr/sam" -a -prune -o -print 的简写表达式按顺序求值, -a 和 -o 都是短路求值,与 shell 的 && 和 || 类似如果 -path "/usr/sam" 为真,则求值 -prune , -prune 返回真,与逻辑表达式为真;否则不求值 -prune ,与逻辑表达式为假。 如果 -path "/usr/sam" -a -prune 为假,则求值 -print ,-print 返回真,或逻辑表达式为真;否则不求值 -print,或逻辑表达式为真。 

例:-newer的用法示例
$ find -newer httpd1.conf  ! -newer temp -ls

例:在当前目录下查找除目录以外的所有类型的文件,可以用:

$ find . ! -type d -print


原创粉丝点击