我不太明白'man find'给出的例子,任何人都可以给我一些例子和解释吗?我可以结合正则表达式吗?如何在sh中使用'find'的'-prune'选项?
更详细的问题是这样的:写一个shell脚本,changeall,它具有像一个接口“changeall [-r | -R]‘字符串1’,‘字符串2’这将找到的所有文件后缀为.h,.C,.cc或.cpp,并将所有出现的“string1”更改为“string2”。-r仅用于保留当前目录或包括子目录。注:1)对于非递归大小写,'ls'是不允许的,我们只能使用'find'和'sed'。2)我试过'find -depth'但是它不被支持,这就是为什么我想知道'-prune'是否可以提供帮助,我不明白'man find'的例子。
EDI T2:我在做任务,我没有很好地提问,因为我想自己完成。由于我已经完成并交付了,现在我可以陈述整个问题。另外,我设法在不使用-prune的情况下完成作业,但仍想学习它。
它在文本中不是100%明显的(但是因为你只打印'* .foo'它不冲突),但-prune部分也不会打印名为“.snapshot”的任何东西(不仅仅是目录)。即'-prune'不仅适用于目录(但是,对于目录而言,它也可以防止进入符合该条件的目录,即这里的目录与'-name .snapshot'匹配)。 – 2013-01-16 16:22:10
和+1为你做了很好的解释(尤其是重要的注释)。你应该将它提交给开发人员(因为手册页没有解释为普通人类“修剪”)^^我花了很多的尝试来解决它,而且我没有看到你警告我们的副作用) – 2013-01-16 16:25:42
@OlivierDulac这是一个很好的关于潜在剥离文件,你想保持。我已经更新了答案,以澄清这一点。顺便说一下,它实际上并不是“-prune”本身。问题是或者运算符“短路”,并且或者具有比和更低的优先级。最终的结果是,如果遇到名为'.snapshot'的文件,它将匹配第一个'-name','-prune'将不做任何事情(但返回true),然后或者返回true,因为它的左参数是真的。动作(例如:'-print')是其第二个参数的一部分,所以它从来没有机会执行。 – 2013-01-19 02:44:19