免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: wingger

shell基础二:查找技巧,find及xargs的使用  关闭 [复制链接]

论坛徽章:
0
发表于 2004-11-09 22:21 |显示全部楼层

shell基础二:查找技巧,find及xargs的使用

[quote]原帖由 "寂寞烈火"]呵呵~~~,find+xargs,才是绝佳组合~~[/quote 发表:



find可以家-exec呀, 不一定要xargs, 有时候更方便

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
发表于 2004-11-09 22:25 |显示全部楼层

shell基础二:查找技巧,find及xargs的使用

原帖由 "panlm" 发表:



find可以家-exec呀, 不一定要xargs, 有时候更方便

嘿嘿~~~ 我也常这么干~

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2004-11-09 22:38 |显示全部楼层

shell基础二:查找技巧,find及xargs的使用

俺看书的速度好像慢了点,第一章花了我十天功夫,这篇看来得两个晚上才能看完

find命令的例子

查找当前用户主目录下的所有文件,下面两种方法都可以使用:
  1. $ find $HOME -print
  2. $ find ~ -print
复制代码


为了在当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件,可以用:
  1. $ find . -type f -perm 644 -exec ls -l {} \;
复制代码


为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径,可以用:
  1. $ find / -type f -size 0 -exec ls -l {} \;
复制代码


查找/var/logs目录中更改时间在7日以前的普通文件,并在删除之前询问它们:
  1. $ find /var/logs -type f -mtime +7 -ok rm {} \;
复制代码


为了查找系统中所有属于root组的文件,可以用:
  1. $find . -group root -exec ls -l {} \;
  2. -rw-r--r--    1 root     root          595 10月 31 01:09 ./fie1
复制代码



下面的find命令将删除当目录中访问时间在7日以来、含有数字后缀的admin.log文件。该命令只检查三位数字,所以相应文件的后缀不要超过999。
先建几个admin.log*的文件 ,才能使用下面这个命令
  1. $ find . -name "admin.log[0-9][0-9][0-9]" -atime -7  -ok
  2. rm {} \;
  3. < rm ... ./admin.log001 > ? n
  4. < rm ... ./admin.log002 > ? n
  5. < rm ... ./admin.log042 > ? n
  6. < rm ... ./admin.log942 > ? n
复制代码


为了查找当前文件系统中的所有目录并排序,可以用:
  1. $ find . -type d  |sort
复制代码


为了查找系统中所有的r m t磁带设备,可以用:
  1. $ find /dev/rmt -print
复制代码


  1. 原书为:
  2. 为了查找当前文件系统中的所有目录并排序,可以用:
  3. $ find . -type d  -loacl -mount |sort
  4. 已更正为:
  5. $ find . -type d |sort
复制代码

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2004-11-10 10:43 |显示全部楼层

shell基础二:查找技巧,find及xargs的使用

论里的其它find的贴子:

find命令中*号的疑惑
http://bbs.chinaunix.net/forum/viewtopic.php?t=349141&highlight=find

Linux中文件查找技术大全
http://bbs.chinaunix.net/forum/viewtopic.php?t=16140

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2004-11-10 10:48 |显示全部楼层

shell基础二:查找技巧,find及xargs的使用

xargs

      在使用f i n d命令的- e x e c选项处理匹配到的文件时, f i n d命令将所有匹配到的文件一起传递给e x e c执行。但有些系统对能够传递给e x e c的命令长度有限制,这样在f i n d命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是x a rg s命令的用处所在,特别是与f i n d命令一起使用。

       F i n d命令把匹配到的文件传递给x a rg s命令,而x a rg s命令每次只获取一部分文件而不是全部,不像- e x e c选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

      在有些系统中,使用- e x e c选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;
       而使用x a rg s命令则只有一个进程。另外,在使用x a rg s命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

      来看看x a rg s命令是如何同f i n d命令一起使用的,并给出一些例子。

      下面的例子查找系统中的每一个普通文件,然后使用x a rg s命令来测试它们分别属于哪类文件
  1. #find . -type f -print | xargs file
  2. ./.kde/Autostart/Autorun.desktop: UTF-8 Unicode English text
  3. ./.kde/Autostart/.directory:      ISO-8859 text\
  4. ......
复制代码


在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中:
  1. $ find / -name "core" -print | xargs echo "" >/tmp/core.log
复制代码

上面这个执行太慢,我改成在当前目录下查找
  1. #find . -name "file*" -print | xargs echo "" > /temp/core.log
  2. # cat /temp/core.log
  3. ./file6
复制代码


在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限:

  1. # ls -l
  2. drwxrwxrwx    2 sam      adm          4096 10月 30 20:14 file6
  3. -rwxrwxrwx    2 sam      adm             0 10月 31 01:01 http3.conf
  4. -rwxrwxrwx    2 sam      adm             0 10月 31 01:01 httpd.conf

  5. # find . -perm -7 -print | xargs chmod o-w
  6. # ls -l
  7. drwxrwxr-x    2 sam      adm          4096 10月 30 20:14 file6
  8. -rwxrwxr-x    2 sam      adm             0 10月 31 01:01 http3.conf
  9. -rwxrwxr-x    2 sam      adm             0 10月 31 01:01 httpd.conf
复制代码


用g r e p命令在所有的普通文件中搜索hostname这个词:
  1. # find . -type f -print | xargs grep "hostname"
  2. ./httpd1.conf:#     different IP addresses or hostnames and have them handled by the
  3. ./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames
  4. on your
复制代码


用g r e p命令在当前目录下的所有普通文件中搜索hostnames这个词:
  1. # find . -name \* -type f -print | xargs grep "hostnames"
  2. ./httpd1.conf:#     different IP addresses or hostnames and have them handled by the
  3. ./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames
  4. on your
复制代码

注意,在上面的例子中, \用来取消f i n d命令中的*在s h e l l中的特殊含义。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
发表于 2004-11-10 10:51 |显示全部楼层

shell基础二:查找技巧,find及xargs的使用

大多数情况下,这个-print是多余滴~(我认为)

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2004-11-10 11:45 |显示全部楼层

shell基础二:查找技巧,find及xargs的使用

原帖由 "寂寞烈火"]大多数情况下,这个-print是多余滴~(我认为)[/quote 发表:


我也是这么认为,呵呵

这两个看不明白,帮忙解析一下        


[quote]为了匹配$ H O M E目录下的所有文件,下面两种方法都可以使用:
$ find $HOME -print
$ find ~ -print


为了查找当前文件系统中的所有目录并排序,可以用:
[code]$ find . -type d -print -local -mount |sort



# find . -type d  | sort
.
./dir1
./file6
./.kde
./.kde/Autostart
./sam
./.xemacs

# ls -l
总用量 52
-rw-r--r--    1 root     root            0 10月 31 18:06 admin.log001
-rw-r--r--    1 root     root            0 10月 31 18:06 admin.log002
-rw-r--r--    1 root     root            0 10月 31 18:06 admin.log042
-rw-r--r--    1 root     root            0 10月 31 18:07 admin.log942
drwxr-xr-x    2 root     root         4096 10月 31 20:26 dir1
-rw-r--r--    1 sam      adm             0 10月 31 01:07 fiel
drwxrwxr-x    2 sam      adm          4096 10月 31 20:25 file6
-rwxrwxr-x    2 sam      adm             0 10月 31 01:01 http3.conf
-rw-r--r--    1 sam      adm         34890 10月 31 00:57 httpd1.conf
-rwxrwxr-x    2 sam      adm             0 10月 31 01:01 httpd.conf
drwxrwxr-x    2 gem      group        4096 10月 26 19:48 sam
-rw-r--r--    1 root     root         2792 10月 31 20:19 temp

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
发表于 2004-11-10 12:09 |显示全部楼层

shell基础二:查找技巧,find及xargs的使用

1,$HOME是shell专用变量,指的是用户的主目录,echo $HOME 一下,看看结果是啥?
2,直接用 find / -type d|sort 就可以

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2004-11-10 13:08 |显示全部楼层

shell基础二:查找技巧,find及xargs的使用

原帖由 "寂寞烈火" 发表:
1,$HOME是shell专用变量,指的是用户的主目录,echo $HOME 一下,看看结果是啥?
2,直接用 find / -type d|sort 就可以


明白了,谢谢     


f i n d命令配合使用e x e c和x a rg s可以使用户对所匹配到的文件执行几乎所有的命令。

下面是find一些常用参数的例子,有用到的时候查查就行了,像上面前几个贴子,都用到了其中的的一些参数,也可以用man或查看论坛里其它贴子有find的命令手册

1、使用name选项

文件名选项是f i n d命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用。
可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来。
不管当前路径是什么,如果想要在自己的根目录$ H O M E中查找文件名符合* . t x t的文件,使用~作为' p a t h n a m e参数,波浪号~代表了你的$ H O M E目录。
  1. $ find ~ -name "*.txt" -print
复制代码


想要在当前目录及子目录中查找所有的‘ * . t x t’文件,可以用:
  1. $ find . -name "*.txt" -print
复制代码


想要的当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用:
  1. $ find . -name "[A-Z]*" -print
复制代码


想要在/ e t c目录中查找文件名以h o s t开头的文件,可以用:
  1. $ find /etc -name "host*" -print
复制代码


想要查找$ H O M E目录中的文件,可以用:
  1. $ find ~ -name "*" -print 或find . -print
复制代码


要想让系统高负荷运行,就从根目录开始查找所有的文件。
  1. $ find / -name "*" -print
复制代码


如果想在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是* . t x t的文件,下面的命令就能够返回名为a x 3 7 . t x t的文件:$
  1. $find . -name "[a-z][a-z][0--9][0--9].txt" -print
复制代码




2、用perm选项

按照文件权限模式用- p e r m选项。

按文件权限模式来查找文件的话。最好使用八进制的权限表示法。

如在当前目录下查找文件权限位为7 5 5的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件,可以用:
  1. $ find . -perm 755 -print
复制代码


还有一种表达方法:在八进制数字前面要加一个横杠-,表示都匹配,如-007就相当于777,-006相当于666
  1. # ls -l
  2. -rwxrwxr-x    2 sam      adm             0 10月 31 01:01 http3.conf
  3. -rw-rw-rw-    1 sam      adm         34890 10月 31 00:57 httpd1.conf
  4. -rwxrwxr-x    2 sam      adm             0 10月 31 01:01 httpd.conf
  5. drw-rw-rw-    2 gem      group        4096 10月 26 19:48 sam
  6. -rw-rw-rw-    1 root     root         2792 10月 31 20:19 temp

  7. # find . -perm 006
  8. # find . -perm -006
  9. ./sam
  10. ./httpd1.conf
  11. ./temp
复制代码



3、忽略某个目录

如果在查找文件时希望忽略某个目录,因为你知道那个目录中没有你所要查找的文件,那么可以使用- 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
复制代码


-perm选项中,我的解析
还有一种表达方法:在八进制数字前面要加一个横杠-,表示都匹配,如-007就相当于777,-006相当于666
不知对不对

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2004-11-10 14:56 |显示全部楼层

shell基础二:查找技巧,find及xargs的使用

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

比如要在/usr/sam目录下查找不在dir1子目录之内的所有文件
  1. find /usr/sam -path "/usr/sam/dir1" -prune -o -print  
复制代码

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,或逻辑表达式为真。  


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

  1. if -path "/usr/sam"  then
  2.           -prune
  3. else
  4.           -print
复制代码



避开多个文件夹
find /usr/sam \( -path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -print


圆括号表示表达式的结合。
\ 表示引用,即指示 shell 不对后面的字符作特殊解释,而留给 find 命令去解释其意义。


查找某一确定文件,-name等选项加在-o 之后
  1. #find /usr/sam  \(-path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -name "temp" -print
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,8.5折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时8.5折扣期:2019年9月30日前


----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP