我不太理解男士所给出的例子,谁能给我一些例子和解释?我可以在里面结合正则表达式吗?
更详细的问题是这样的:
写一个shell脚本changeall,它有一个类似changeall [-r| -r] "string1" "string2"的接口。它将找到后缀为.h、.c、.cc或.cpp的所有文件,并将所有出现的string1更改为string2。-r是只保留当前目录或包含子目录的选项。
注意:
对于非递归的情况,ls是不允许的,我们只能使用find和sed。
我尝试寻找深度,但它不支持。这就是为什么我想知道-prune是否可以帮助,但不理解从man find的例子。
EDIT2:我在做作业,我没有问太多细节,因为我想自己完成。既然我已经做完并交上来了,现在我可以陈述整个问题了。此外,我没有使用-prune就完成了作业,但无论如何我都想学习它。
如果你读了这里所有的好答案,我现在的理解是,以下都返回相同的结果:
find . -path ./dir1\* -prune -o -print
find . -path ./dir1 -prune -o -print
find . -path ./dir1\* -o -print
#look no prune at all!
但最后一个将花费更长的时间,因为它仍然搜索dir1中的所有内容。我想真正的问题是如何在不实际搜索的情况下删除不需要的结果。
所以我猜prune的意思是不要美化过去的比赛,而是把它标记为已经完成…
http://www.gnu.org/software/findutils/manual/html_mono/find.html
“然而,这并不是由于‘修剪’动作的影响(它只是防止进一步下降,并不能确保我们忽略该项目)。相反,这种效果是由于使用了' -o '。由于./src/emacs的" or "条件左边已经成功,因此对于这个特定的文件,根本没有必要计算右边(' -print ')的值。"
如果你读了这里所有的好答案,我现在的理解是,以下都返回相同的结果:
find . -path ./dir1\* -prune -o -print
find . -path ./dir1 -prune -o -print
find . -path ./dir1\* -o -print
#look no prune at all!
但最后一个将花费更长的时间,因为它仍然搜索dir1中的所有内容。我想真正的问题是如何在不实际搜索的情况下删除不需要的结果。
所以我猜prune的意思是不要美化过去的比赛,而是把它标记为已经完成…
http://www.gnu.org/software/findutils/manual/html_mono/find.html
“然而,这并不是由于‘修剪’动作的影响(它只是防止进一步下降,并不能确保我们忽略该项目)。相反,这种效果是由于使用了' -o '。由于./src/emacs的" or "条件左边已经成功,因此对于这个特定的文件,根本没有必要计算右边(' -print ')的值。"
修剪是一个“不递归此文件”开关(操作)。
从手册页
如果-depth未指定,则为true;
如果文件是一个目录,不要进入它。
如果给出了-depth,则为false;没有效果。
基本上它不会下降到任何子目录。
举个例子:
您有以下目录:
% find home
home
home/test1
home/test1/test1
home/test2
home/test2/test2
查找home -name test2将打印父目录和名为test2的子目录:
% find home -name test2
home/test2
home/test2/test2
现在,用-西梅…
找到home -name test2 -prune将只打印/home/test2;它不会进入/home/test2找到/home/test2/test2:
% find home -name test2 -prune
home/test2
我不是这方面的专家(这个页面和http://mywiki.wooledge.org/UsingFind一起非常有帮助)
注意-path是一个完全匹配find(后面的字符串/path的路径。在这些例子中),其中as -name匹配所有的基名。
find . -path ./.git -prune -o -name file -print
阻塞当前目录中的.git目录(就像你在。目录中找到的一样)
find . -name .git -prune -o -name file -print
递归地阻塞所有.git子目录。
注意。/是非常重要的!!-path必须匹配锚定到的路径。或者在find之后出现的任何东西,如果你匹配了它(从或'-o'的另一边),可能没有被修剪!
我天真地没有意识到这一点,它让我使用-path当它是伟大的,当你不想修剪所有的子目录具有相同的basename:D
添加到其他答案中给出的建议(我没有代表创建回复)…
当将-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之后,我最近才开始寻找出现这种情况的原因。