Linux find命令详解,查找时非管道排除目录

find是linux 命令,它将档案系统内符合 expression 的档案列出来。你可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find 根据下列规则判断 path 和 expression,在命令列上第一个 – ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。
find命令的参数

pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
-print: find命令将匹配的文件输出到标准输出。
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为’command’ { } \;,注意{ }和\;之间的空格。
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
# -print 将查找到的文件输出到标准输出
# -exec   command   {} \;      —–将查到的文件执行command操作,{} 和 \;之间有空格
# -ok 和-exec相同,只不过在操作前要询用户

====================================================
-name   filename       #查找名为filename的文件
-perm                  #按执行权限来查找
-user    username      #按文件属主来查找
-group groupname       #按组来查找
-mtime   -n +n         #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime    -n +n        #按文件访问时间来查GIN: 0px">
-ctime    -n +n        #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup               #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser                #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer   f1 !f2        #找文件,-n指n天以内,+n指n天以前 
-empty                 #空的档案-gid n or -group name : gid 是 n 或是 group 名称是 name
-ipath p,-path p       #路径名称符合 p 的档案,ipath 会忽略大小写
-ctime    -n +n        #按文件创建时间来查找文件,-n指n天以内,+n指n天以前 
-nogroup               #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser                #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer   f1 !f2        #查更改时间比f1新但比f2旧的文件
-type    b/d/c/p/l/f   #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size      n[c]        #查长度为n块[或n字节]的文件
-depth                 #使查找在进入子目录前先行查找完本目录
-newer file1 ! file2   #查更改时间比f1新但比f2旧的文件
-type    b/d/c/p/l/f   #查是块设备/目录/字符设备/管道/符号链接/普通文件
-size      n[c]        #查长度为n块[或n字节]的文件
-depth                 #使查找在进入子目录前先行查找完本目录
-fstype                #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-follow                #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio                  #对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。
-mount                 #查文件时不跨越文件系统mount点
-prune                  #忽略某个目录,使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。

现在来详细说说-prune

find [-path ..] [expression] 在路径列表的后面的是表达式

-path "/usr/kinggoo" -prune -o -print 是 -path "/usr/kinggoo"-a -prune -o -print 的简写表达式按顺序求值, -a 和 -o 都是短路求值,与 shell 的 && 和 || 类似如果 -path "/usr/kinggoo" 为真,则求值 -prune , -prune 返回真,与逻辑表达式为真;否则不求值 -prune,与逻辑表达式为假。如果 -path "/usr/kinggoo" -a -prune 为假,则求值 -print ,-print返回真,或逻辑表达式为真;否则不求值 -print,或逻辑表达式为真。如果要加其他选项需要加在-o之后(下面会有例子)

find /usr/kinggoo -path "/usr/kinggoo/T" -prune -o -print

这个表达式组合特例可以用伪码写为

if -path "/usr/kinggoo/T" then
	-prune
else
	-print

避开多个文件夹

find /usr/kinggoo \( -path /usr/kinggoo/T -o -path /usr/kinggoo/file1 \) -prune -o -print

圆括号表示表达式的结合。

\ 表示引用,即指示 shell 不对后面的字符作特殊解释,而留给 find 命令去解释其意义

详细例子:

[root@kinggoo svnconf]# find  ../svnconf \( -path ../svnconf/qiyemoban \) -prune -o -print
../svnconf
../svnconf/txt
../svnconf/index.html
../svnconf/qa.conf
../svnconf/index.html.bk
../svnconf/android_vt.conf
../svnconf/NULL
../svnconf/svntomail.sh
../svnconf/svntomail.sh.bk
../svnconf/qiyemoban.zip
../svnconf/android_pad.conf
发现了吧 上面没有qiyemoban这个文件夹了,其实他没有被打印出来,
[root@kinggoo svnconf]# ls
android_vt.conf     index.html     NULL     qiyemoban      svntomail.sh     txt
android_pad.conf    index.html.bk  qa.conf  qiyemoban.zip  svntomail.sh.bk

查找某一确定文件,-name、-type等选项加在-o 之后

例:

[root@kinggoo svnconf]# find  ../svnconf \( -path ../svnconf/qiyemoban \) -prune -o -name "txt" -print
../svnconf/txt
[root@kinggoo svnconf]# find  ../svnconf \( -path ../svnconf/qiyemoban \) -prune -o -type d -print
../svnconf  # 当然只有自己是目录了,为了演示使用的是../上一级在指定当前目录 只是我懒。跟find正常命令一样即可

望有帮助!

- THE END -
版权声明:
转载原创文章请注明,文章出处:http://kinggoo.com
原文地址:http://kinggoo.com/sysfinddetail.htm
发表评论?

2 条评论。

  1. $@为传入的参数,是被包住的
    iregex忽略大小写
    相关资料
    GNU的find支持多种风格的正则表达式,用-regextype 指定所使用的正则表达式类型,可选的有emacs(默认),posix-awk,posix-basic,posix-egrep,posix-extended,喜欢了grep -E,所以我就用posix-egrep了

    find / -regextype “posix-egrep” -regex “.*/find”

  2. 记录一下群里一个人的问题
    find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -regextype posix-egrep -iregex ‘(.*\/Makefile|.*\/Makefile\..*|.*\.make|.*\.mak|.*\.mk)’ -type f -print0 | xargs -0 grep –color -n “$@”
    我的简单解答
    find . -name .repo -prune -o -name .git -prune -o -path ./out -prune -o -regextype posix-egrep -iregex
    不行 就执行 -prune -o 后面的 一直到 最后一个-prune -o 使用正则表达式 e-grep类型的 或略大小写
    -print0 是防止文件名里有空 影响find 后的xargs

发表评论