我不太理解男士所给出的例子,谁能给我一些例子和解释?我可以在里面结合正则表达式吗?


更详细的问题是这样的:

写一个shell脚本changeall,它有一个类似changeall [-r| -r] "string1" "string2"的接口。它将找到后缀为.h、.c、.cc或.cpp的所有文件,并将所有出现的string1更改为string2。-r是只保留当前目录或包含子目录的选项。

注意:

对于非递归的情况,ls是不允许的,我们只能使用find和sed。 我尝试寻找深度,但它不支持。这就是为什么我想知道-prune是否可以帮助,但不理解从man find的例子。


EDIT2:我在做作业,我没有问太多细节,因为我想自己完成。既然我已经做完并交上来了,现在我可以陈述整个问题了。此外,我没有使用-prune就完成了作业,但无论如何我都想学习它。


当前回答

显示所有内容,包括dir本身,但不显示其冗长乏味的内容:

find . -print -name dir -prune

其他回答

Find构建一个文件列表。它将您提供的谓词应用到每个谓词,并返回通过的谓词。

-prune的意思是排除在结果之外,这让我很困惑。你可以排除一个文件不修剪:

find -name 'bad_guy' -o -name 'good_guy' -print  // good_guy

-prune所做的只是改变搜索行为。如果当前匹配的是一个目录,它会说“嘿,找到你刚才匹配的那个文件,不要进入它”。它只是从要搜索的文件列表中删除该树(而不是文件本身)。

它应该被命名为-don - descent。

显示所有内容,包括dir本身,但不显示其冗长乏味的内容:

find . -print -name dir -prune

我不是这方面的专家(这个页面和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之后,我最近才开始寻找出现这种情况的原因。

注意,-prune并不像某些人说的那样防止下降到任何目录。它可以防止下降到与应用它的测试匹配的目录。也许一些例子会有所帮助(参见下面的正则表达式示例)。抱歉这么长时间。

$ find . -printf "%y %p\n"    # print the file type the first time FYI
d .
f ./test
d ./dir1
d ./dir1/test
f ./dir1/test/file
f ./dir1/test/test
d ./dir1/scripts
f ./dir1/scripts/myscript.pl
f ./dir1/scripts/myscript.sh
f ./dir1/scripts/myscript.py
d ./dir2
d ./dir2/test
f ./dir2/test/file
f ./dir2/test/myscript.pl
f ./dir2/test/myscript.sh

$ find . -name test
./test
./dir1/test
./dir1/test/test
./dir2/test

$ find . -prune
.

$ find . -name test -prune
./test
./dir1/test
./dir2/test

$ find . -name test -prune -o -print
.
./dir1
./dir1/scripts
./dir1/scripts/myscript.pl
./dir1/scripts/myscript.sh
./dir1/scripts/myscript.py
./dir2

$ find . -regex ".*/my.*p.$"
./dir1/scripts/myscript.pl
./dir1/scripts/myscript.py
./dir2/test/myscript.pl

$ find . -name test -prune -regex ".*/my.*p.$"
(no results)

$ find . -name test -prune -o -regex ".*/my.*p.$"
./test
./dir1/test
./dir1/scripts/myscript.pl
./dir1/scripts/myscript.py
./dir2/test

$ find . -regex ".*/my.*p.$" -a -not -regex ".*test.*"
./dir1/scripts/myscript.pl
./dir1/scripts/myscript.py

$ find . -not -regex ".*test.*"                   .
./dir1
./dir1/scripts
./dir1/scripts/myscript.pl
./dir1/scripts/myscript.sh
./dir1/scripts/myscript.py
./dir2