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


更详细的问题是这样的:

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

注意:

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


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


当前回答

注意,-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

其他回答

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

find . -print -name dir -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 ')的值。"

答案有很多;有些书的理论内容太多了。我会留下为什么我需要修剪一次,所以也许需求优先/例子类型的解释对某人有用:)

问题

我有一个包含大约20个节点目录的文件夹,每个目录都有它的node_modules目录。

一旦进入任何项目,就会看到每个../node_modules/module。但你知道是怎么回事。几乎每个模块都有依赖关系,所以你看到的更像是projectN/node_modules/ modulelex /node_modules/moduleZ…

我不想被一堆依赖的东西淹没

知道-d n/ -depth n,这对我没有帮助,因为我想要的每个项目的main/first node_modules目录在不同的深度,像这样:

Projects/MysuperProjectName/project/node_modules/...
Projects/Whatshisname/version3/project/node_modules/...
Projects/project/node_modules/...
Projects/MysuperProjectName/testProject/november2015Copy/project/node_modules/...
[...]

我怎么能得到第一个路径列表结束在第一个node_modules和移动到下一个项目,以获得相同?

输入删除

当添加-prune时,仍然会有一个标准的递归搜索。每条“路径”都会被分析,每一个发现都会被抛出,而find会像一个好人一样继续深入挖掘。但是,深入挖掘更多的node_modules是我不想要的。

所以,不同之处在于,在这些不同的路径中,-prune会发现,当它找到你的项目时,它会停止在特定的道路上进一步挖掘。在我的例子中,是node_modules文件夹。

我不是这方面的专家(这个页面和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

通常,我们在Linux中做事的原生方式,以及我们思考的方式,是从左到右的。

你可以先写下你想要的东西:

find / -name "*.php"

然后,您按下ENTER键,并意识到您从不想获取的目录中获取了太多文件。

因此,您认为“让我们排除/media以避免搜索挂载驱动器。”

现在你只需要将以下内容添加到前面的命令中:

-print -o -path '/media' -prune

最后一个命令是:

find / -name "*.php" -print -o -path '/media' -prune
|<--      Include      -->|<--      Exclude      -->|

我认为这种结构要简单得多,而且与正确的方法相关。