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
避开多个文件夹
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 -