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正常命令一样即可
望有帮助!
如何复制4层以上的文件目录结构,不要文件(文件太大,不适合拷贝)?
答案:最大四层用 find / -type d -maxdepth 4
答案:四层以上用这个 find / -type d -mindepth 4
$@为传入的参数,是被包住的
iregex忽略大小写
相关资料
GNU的find支持多种风格的正则表达式,用-regextype 指定所使用的正则表达式类型,可选的有emacs(默认),posix-awk,posix-basic,posix-egrep,posix-extended,喜欢了grep -E,所以我就用posix-egrep了
find / -regextype “posix-egrep” -regex “.*/find”
记录一下群里一个人的问题
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