shell中find命令的使⽤要点
linux中的find的命令查⽂件的重要⽅式,辅以其他的bash命令可以实现强⼤的操作效果。
先看看放find命令的基本组成:
find pathname -option [-print -exec -ok ...]
分类记忆各项属性参数~
pathname:指定find命令的查询根路径,例如 ‘ / ’,‘./ ' 等。
同时还可在-path参数中指定搜索路径。
-option:
1、⽂件操作:
-type 指定查⽂件的类型
b - 块设备⽂件。
d - ⽬录。
c - 字符设备⽂件。
p - 管道⽂件。
l - 符号链接⽂件。
f - 普通⽂件。
-size n 指定⽂件⼤⼩,若数字前+表⽰⼤于,-表⽰⼩于;常⽤单位c(字节),k(KB),M(MB)
2、⽤户权限:
-perm ⽤户权限permission,⽤常⽤的三位数字,如644表⽰权限。若数字前+表⽰⾄少包括指定的⼀种访问权限,-表⽰必须包括指定的所有访问权限
-user / -nouser 按⽂件属主查询 / 查⽆有效属主的⽂件
-group / -nogroup 按⽂件所属租来查 / 查⽆有效所属租的⽂件
3、时间选项:
-atime / -amin n 最近访问(accessed)过的⽂件,前者表⽰单位是天(24h),后者单位是分钟(minute);若数字前+表⽰n段时间前,-表⽰最近n段时间。后同。
-ctime / -cmin n 最近状态改变(changed)过的⽂件
-mtime / -mmin n 最近内容修改(modified)过的⽂件
-newer file!otherfile 查更改时间⽐file新的⽂件,加上⾮(!)则查⽐otherfile旧的⽂件
(注意,逻辑符号包括!(not)、-a(and)、-o(or),在命令中都是短路求值,简单讲就是若后⾯的参数不影响逻辑判断,则不对后⾯求值。在find命令中⼀般在选项之前添加逻辑符号)
4、⽂件路径:
-follow 遇到符号链接⽂件,就跟踪到链接指向的⽂件
-mount 不跨越⽂件系统的mount点,即在当前的⽂件系统查询,不进⼊其他⽂件系统(如挂
载的windows系统)
$ find . -path './var/www*' -name 'index.html' -print
./var/www/learn/study_smarty/templates/index.tpl
./var/www/learn/study_smarty/docs/index.php
./var/www/learn/index.php
./var/www/index.html
(结果中可以看到,-path选项中的参数要为模糊的查询条件,我理解的-path选项查出的⽂件名实际上是带路径的字符串,⽽-path中则是满⾜结果字符串中的前⾯的路径字符。)
find查命令的使用 -prune 指出要忽略的⽬录。结合-path选项,例如在当前⽬录下查‘ index.html ’⽂件,同时忽略路径下的‘ /www/bin
’⽬录:
$ find . -path './www/bin' -prune -o -name 'index.html' -print
-path “./www/bin” -prune -o -name 'index.html' -print 是 -path “./www/bin” -a -prune -o -name 'index.html' -print 的简写表达式。按顺序求值,-a 和 -o 都是短路求值,与 shell 的 && 和 || 类似如果 -path “./www/bin” 为真,则求值 -prune , -prune 返回真,“与”逻辑表达式为真;否则不求值 -prune,与逻辑表达式为假。如果 -path “/usr/sam” -a -prune 为假,则求值 -name。-name返回
真,“或”逻辑表达式为真;否则不求值 -name,“或”逻辑表达式为真。
(因此,其他的查询条件必须放在-o之后!⽽-path选项⼀般放在最前,-prune和-o也要连⽤)
避开多个⽂件可以⽤:
$ find /usr \(-path /usr/dir1 -o -path /usr/dir2 \) -prune -o -name "index.html" -print
‘ \(’ 与 ‘ \) ’ 表⽰转义,及shell不再对括号做特殊解释,这⾥转义后的括号表⽰结合。
(注意,路径后不能在加 ‘/’ 号!)
-depth 先匹配所有的⽂件,再在⼦⽬录中查。即⼴度遍历查询。注意加上-depth选项后,-prune选项失效。
-maxdepth n 设定递归搜索的⽬录层级,1为在当前⽬录下,即不递归搜索。
5、查询执⾏:
-exec command {} \; 对查询的结果⽂件执⾏command 命令,{}中就包含着查询结果。
-ok command {} \; 与-exec有着相同的操作,不同的是,在执⾏command命令时会有交互提⽰你是否执⾏,是⼀种相对安全的做法。
在使⽤find命令的-exec选项处理匹配到的⽂件时, find命令将所有匹配到的⽂件⼀起传递给exec执⾏。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运⾏⼏分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。在有些系统中,使⽤-exec选项会为处理每⼀个匹配到的⽂件⽽发起⼀个相应的进程,并⾮将匹配到的⽂件全部作为参数⼀次执
⾏;这样在有些情况下就会出现进程过多,系统性能下降的问题,因⽽效率不⾼。转
xargs 与pipe连⽤,对匹配的⽂件执⾏操作。
find命令把匹配到的⽂件传递给xargs命令,⽽xargs命令每次只获取⼀部分⽂件⽽不是全部,不像-exec选项那样。这样它可以先处理最先获取的⼀部分⽂件,然后是下⼀批,并如此继续下去。使⽤xargs命令则只有⼀个进程。转
例如,在当前路径下的普通⽂件中搜索‘ admin ’:
$ find . -type f -print | xargs grep'admin'
对于⼀个参数的命令,xargs隐含传递匹配⽂件,如上述grep files,将结果隐含传递给files。如是多参数命令,如cp file dir,则要利⽤xargs 的 -i 选项,例如将上述查询的问价copy⾄‘ /usr ’:
$ find . -type f -print | xargs -i cp {} /usr/
加上 -i 选项后,xargs将匹配的结果传递给 {} ,这样就⽅便多参数命令的使⽤了。
ok,打完⼿⼯,欢迎交流。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论