免费注册 查看新帖 |

Chinaunix

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

[文本处理] 关于find -prune的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-01-02 21:23 |只看该作者 |倒序浏览
  1. [root@vhost1 a]# ls -R .
  2. .:
  3. a  b

  4. ./b:
  5. a
  6. [root@vhost1 a]# find . -path './b' -prune -o -type f
  7. ./b
  8. ./a
  9. [root@vhost1 a]# find . -path './b' -prune
  10. ./b
复制代码
能否利用短路方式给分解一下,讲讲执行过程,谢谢,实在是糊涂了

论坛徽章:
0
2 [报告]
发表于 2014-01-02 21:24 |只看该作者
目录结构是:当前目录下有a文件和b目录,b目录下有另一个a文件

论坛徽章:
0
3 [报告]
发表于 2014-01-02 21:40 |只看该作者
为什么第一条命令会输出一个目录b呢。。。

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
4 [报告]
发表于 2014-01-02 22:10 |只看该作者
回复 3# aaa103439


    理解下-prune
   
True;  if  the  file  is a directory, do not descend into it.

论坛徽章:
0
5 [报告]
发表于 2014-01-02 22:23 |只看该作者
好的,我再去看看man回复 4# yinyuemi


   

论坛徽章:
0
6 [报告]
发表于 2014-01-02 23:16 |只看该作者
大神,还是理解不了。。。
我又做了以下测试
[root@vhost1 a]# ls -R
.:
a  b  c  d

./b:
b

./c:
c

./d:
[root@vhost1 a]# find . -path './b' -prune -o -type f
./b
./c/c
./a
[root@vhost1 a]# find . -path './b' -prune -o -print
.
./d
./c
./c/c
./a
[root@vhost1 a]# find . -path './e' -prune -o -type f
./b/b
./c/c
./a

现在的疑问如下:
先说第二条命令,我的理解是这样的-->
首先找到了./b(真)&& -prune(真) 则对./b不执行-print,所以在排除./b目录之后,输出剩余的当前文件列表
如果按照这种理解的话,那么第三条也可以理解,但是第一条却无法理解,因为他输出了一个目录./b,却又貌似执行了-type f(因为d目录没有输出)

再次尝试,

[root@vhost1 a]# find . -path './b' -prune -o -type f -print
./c/c
./a

更迷惑了





回复 4# yinyuemi


   

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
7 [报告]
发表于 2014-01-02 23:43 |只看该作者
回复 6# aaa103439
  1. find {exp1} -o {exp2}
  2. [root@vhost1 a]# find . -path './b' -prune -o -type f  #
  3. ./b  # {exp1}
  4. ./c/c # {exp2}
  5. ./a # {exp2}
  6. [root@vhost1 a]# find . -path './b' -prune -o -print  # when exp1 returns true, -print would not be exec.
  7. .   # {exp2}
  8. ./d  # {exp2}
  9. ./c  # {exp2}
  10. ./c/c  # {exp2}
  11. ./a  # {exp2}
  12. [root@vhost1 a]# find . -path './e' -prune -o -type f  # exp1 always return false, so lists all the file
  13. ./b/b   # {exp1}
  14. ./c/c    # {exp2}
  15. ./a   # {exp2}

  16. [root@vhost1 a]# find . -path './b' -prune -o -type f -print # it will list all the file, except for the ones in the directory './b'
  17. ./c/c
  18. ./a

复制代码

论坛徽章:
0
8 [报告]
发表于 2014-01-03 09:40 |只看该作者
谢谢,我觉得自己应该是理解了,-prune是先有不执行,后有忽略一说,我上去直接否定了,导致后面理解出错
其次,我直接按照短路来理解也有问题,他只是类似短路回复 7# yinyuemi


   

论坛徽章:
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
9 [报告]
发表于 2014-01-03 11:57 |只看该作者
回复 6# aaa103439
  1. If the expression contains no actions other than -prune, -print is performed on all files for which the expression is true.
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP