LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 999|回复: 4

请问这个find命令错在哪里? 谢谢!

[复制链接]
发表于 2010-9-22 21:09:32 | 显示全部楼层 |阅读模式
在/tmp/Temp文件夹下有

1.txt  2.txt  3.sh

用 find /tmp/Temp/ -iname '*.txt' -o -iname '*.sh' 找到

/tmp/Temp/2.txt
/tmp/Temp/1.txt
/tmp/Temp/3.sh

但是用

find /tmp/Temp/ -iname '*.txt' -o -iname '*.sh' -exec mv {} ~/Desktop/Temp/ \;

却只能移动3.sh到 ~/Desktop/Temp
请问这是什么原因呢?

谢谢热心人的解答!!
发表于 2010-9-22 22:10:31 | 显示全部楼层
你需要把find工具看成一个对目录树中节点的匹配器,-exec参数同样是一种匹配条件(当后面的命令执行成功返回状态0时说明匹配成功)...
  1. find /tmp/Temp/ \( -iname '*.txt' -o -iname '*.sh' \) -exec mv {} ~/Desktop/Temp/ \;
复制代码
下面两个命令会返回相同的结果,但是后者运行更慢一些,因为对每个结果起码都会fork出一个test进程
  1. find . -type d -print
复制代码
  1. find . -exec test -d {} \; -print
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-23 04:53:29 | 显示全部楼层
谢谢 Jockey 兄的热心解答, 还是有点不明白, 我发现运行

find -iname '*.txt' -o -iname '*.sh' -print

结果只能显示3.sh这个文件,-print参数只能显示上一个表达式的结果, 加括号是提高了优先级还是把他变成了一个表达式?
唉, 越搞越乱
回复 支持 反对

使用道具 举报

发表于 2010-9-23 10:34:44 | 显示全部楼层
-print也是一个条件,但它总是为真,并且带有副作用,即打印出结果
几个连着的条件实际是与的关系,即
  1. find . -iname '*.txt' -o -iname '*.sh' -print
复制代码
相当于
  1. find . \( -iname '*.txt' \) -o \( -iname '*.sh' -a -print \)
复制代码
-o的优先级比-a低一点,这在很多程序设计语言的布尔表达式构造中也能得到反应;加括号的道理无非是想表达(1+2)*3而不是1+2*3,在条件组在一起比较复杂时,适当的添加括号可以增进可读性。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-23 17:05:33 | 显示全部楼层
谢谢Jockey兄, 也就是说find命令除了查找路径以外其他参数都是表达式,那就不难理解以前运行
find /tmp -iname  '*.sh'  -iname  '*.txt'  原来是等于  find /tmp -iname  '*.sh'  -a  -iname  '*.txt'
难怪找不到文件, 非常感谢!
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表