我不太理解男士所给出的例子,谁能给我一些例子和解释?我可以在里面结合正则表达式吗?
更详细的问题是这样的:
写一个shell脚本changeall,它有一个类似changeall [-r| -r] "string1" "string2"的接口。它将找到后缀为.h、.c、.cc或.cpp的所有文件,并将所有出现的string1更改为string2。-r是只保留当前目录或包含子目录的选项。
注意:
对于非递归的情况,ls是不允许的,我们只能使用find和sed。
我尝试寻找深度,但它不支持。这就是为什么我想知道-prune是否可以帮助,但不理解从man find的例子。
EDIT2:我在做作业,我没有问太多细节,因为我想自己完成。既然我已经做完并交上来了,现在我可以陈述整个问题了。此外,我没有使用-prune就完成了作业,但无论如何我都想学习它。
添加到其他答案中给出的建议(我没有代表创建回复)…
当将-prune与其他表达式组合使用时,根据所使用的其他表达式,行为会有细微的差异。
@Laurence Gonsalves的例子会找到“*”。Foo“文件不在下面”。快照”目录:-
find . -name .snapshot -prune -o -name '*.foo' -print
然而,这个略有不同的简写也会列出.snapshot目录(以及任何嵌套的.snapshot目录):-
find . -name .snapshot -prune -o -name '*.foo'
根据posix manpage,原因是:
如果给定的表达式不包含任何主-exec,
-ls, -ok,或-print,则给定表达式有效地替换为:
(given_expression) -打印
也就是说,第二个示例相当于输入以下内容,从而修改术语的分组:-
find . \( -name .snapshot -prune -o -name '*.foo' \) -print
至少在Solaris 5.10上可以看到这一点。在使用了大约10年的各种*nix之后,我最近才开始寻找出现这种情况的原因。
通常,我们在Linux中做事的原生方式,以及我们思考的方式,是从左到右的。
你可以先写下你想要的东西:
find / -name "*.php"
然后,您按下ENTER键,并意识到您从不想获取的目录中获取了太多文件。
因此,您认为“让我们排除/media以避免搜索挂载驱动器。”
现在你只需要将以下内容添加到前面的命令中:
-print -o -path '/media' -prune
最后一个命令是:
find / -name "*.php" -print -o -path '/media' -prune
|<-- Include -->|<-- Exclude -->|
我认为这种结构要简单得多,而且与正确的方法相关。