免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3898 | 回复: 5
打印 上一主题 下一主题

[文本处理] find 在 -o -exec 同时使用时的怪异问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-01-05 22:34 |只看该作者 |倒序浏览
[root@localhost hoho]# ls -l ./
total 0
lrwxrwxrwx  1 root root   7 Jan  5 08:06 bin -> usr/bin
dr-xr-xr-x  2 root root  40 Jul  8 04:56 boot
drwxr-xr-x  2 root root  40 Jul  8 04:56 dev
drwxr-xr-x 12 root root 700 Jan  5 08:06 etc
drwxr-xr-x  2 root root  40 Jul  8 04:56 home
lrwxrwxrwx  1 root root   7 Jan  5 08:06 lib -> usr/lib
drwxr-xr-x  2 root root  40 Jul  8 04:56 media
drwxr-xr-x  2 root root  40 Jul  8 04:56 mnt
drwxr-xr-x  2 root root  40 Jul  8 04:56 opt
dr-xr-xr-x  2 root root  40 Jul  8 04:56 proc
dr-xr-x---  2 root root  40 Jul  8 04:56 root
drwxr-xr-x  2 root root  40 Jul  8 04:56 run
lrwxrwxrwx  1 root root   8 Jan  5 08:06 sbin -> usr/sbin
drwxr-xr-x  2 root root  40 Jul  8 04:56 srv
drwxr-xr-x  2 root root  40 Jul  8 04:56 sys
drwxrwxrwt  2 root root  40 Jul  8 04:56 tmp
drwxr-xr-x 12 root root 260 Jan  5 08:06 usr
drwxr-xr-x 18 root root 400 Jan  5 08:06 var


上述目录有三个符号链接  sbin , bin ,lib
然后分别测试以下三个命令都没问题,
  1. find ./ -maxdepth 1 -type d
  2. find ./ -maxdepth 1 -type l
  3. find ./ -maxdepth 1 -type d -o -type l
复制代码

但以下命令就得不到期望的效果了(期望的结果是找到 目录 或者 符号链接 并执行某一命令)
  1. find ./ -maxdepth 1 -type d -o -type l -exec echo {} \;
复制代码

这命令的结果好像仅由后一个 -type 指定了,即该例中只输出符号链接,
另外测试发现, 如果两个 -type 指定相同类型时,
-type d -o -type d
-type l -o -type l
一旦加上 -exec 选项, 没结果输出了?! (平台: fedora 19, findutils-4.5.11-1.fc19.i686, archlinux findutils 4.4.2-5 都测过)

大牛们, 请教一下这是什么原因呢 ? 还是我的命令有错误呢 ?  

好像有见过帖子介绍 xargs 时说过是跟 find 传递搜索到的结果的方式有关, 但找不到了,无法求证...
特再发贴求高人解惑. 先谢过了.

测试结果如下, 有点长:
  1. [root@localhost hoho]# find ./ -maxdepth 1 -type d
  2. ./
  3. ./tmp
  4. ./sys
  5. ./srv
  6. ./root
  7. ./proc
  8. ./opt
  9. ./mnt
  10. ./media
  11. ./home
  12. ./dev
  13. ./boot
  14. ./etc
  15. ./run          # 全是目录类型,OK
  16. ./usr
  17. ./var
  18. [root@localhost hoho]# find ./ -maxdepth 1 -type l
  19. ./sbin
  20. ./lib  # 都是符号链接, OK
  21. ./bin   
  22. [root@localhost hoho]# find ./ -maxdepth 1 -type d -o -type l
  23. ./
  24. ./tmp
  25. ./sys
  26. ./srv
  27. ./sbin
  28. ./root
  29. ./proc
  30. ./opt
  31. ./mnt
  32. ./media
  33. ./lib
  34. ./home
  35. ./dev
  36. ./boot
  37. ./bin   # 有目录,有符号链接.也正确   
  38. ./etc
  39. ./run
  40. ./usr
  41. ./var
  42. [root@localhost hoho]# find ./ -maxdepth 1 -type d -o -type l -exec echo {} \;
  43. ./sbin
  44. ./lib   # ?, 说好的 -type d 呢?
  45. ./bin
  46. [root@localhost hoho]# find ./ -maxdepth 1 -type l -o -type d -exec echo {} \;
  47. ./
  48. ./tmp
  49. ./sys
  50. ./srv
  51. ./root
  52. ./proc
  53. ./opt
  54. ./mnt
  55. ./media
  56. ./home   # ? 说好的 -type l 呢?
  57. ./dev
  58. ./boot
  59. ./etc
  60. ./run
  61. ./usr
  62. ./var
  63. [root@localhost hoho]# find ./ -maxdepth 1 -type l -o -type l -exec echo {} \;
  64. [root@localhost hoho]#   啥都没了 ?
复制代码

论坛徽章:
0
2 [报告]
发表于 2014-01-05 23:38 |只看该作者
试试这个(没有测试
  1. find ./ -maxdepth 1 \( -type d -o -type l   \) -exec echo {} \;
复制代码

论坛徽章:
0
3 [报告]
发表于 2014-01-06 00:32 |只看该作者
回复 2# nibuduomaomao

得到期望结果了!  兄台高见, 多谢多谢!!  

  看来是条件表达式并没有合在一起运算.

一楼中所有有问题的命令,测试全正常了.
  1. [root@localhost hoho]# find ./ -maxdepth 1 \( -type d -o -type l   \) -exec echo {} \;
  2. ./
  3. ./tmp
  4. ./sys
  5. ./srv
  6. ./sbin
  7. ./root
  8. ./proc
  9. ./opt
  10. ./mnt
  11. ./media
  12. ./lib
  13. ./home
  14. ./dev
  15. ./boot
  16. ./bin
  17. ./etc
  18. ./run
  19. ./usr
  20. ./var
  21. [root@localhost hoho]#
复制代码

论坛徽章:
4
白羊座
日期:2013-09-17 21:59:30技术图书徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40双子座
日期:2013-12-17 18:26:39
4 [报告]
发表于 2014-01-06 00:53 |只看该作者
  1. The  expression  is  made up of options (which affect overall operation
  2.        rather than the processing of a specific file, and always return true),
  3.        tests  (which  return  a  true or false value), and actions (which have
  4.        side effects and return a true or false value), all separated by opera‐
  5.        tors.  -and is assumed where the operator is omitted.
复制代码
  1. If the expression contains no actions other than -prune, -print is per‐
  2.        formed on all files for which the expression is true.
复制代码
还有and的优先级高于or

论坛徽章:
0
5 [报告]
发表于 2014-01-06 01:02 |只看该作者
回复 4# 井蛙夏虫


    谢谢.
学习了.

论坛徽章:
4
白羊座
日期:2013-09-17 21:59:30技术图书徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40双子座
日期:2013-12-17 18:26:39
6 [报告]
发表于 2014-01-06 01:06 |只看该作者
回复 5# tseesing
这些都是man文档中的

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP