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


更详细的问题是这样的:

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

注意:

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


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


当前回答

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

问题

我有一个包含大约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文件夹。

其他回答

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

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

find / -name "*.php"

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

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

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

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

最后一个命令是:

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

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

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

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

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

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

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

修剪是一个“不递归此文件”开关(操作)。

从手册页

如果-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

添加到其他答案中给出的建议(我没有代表创建回复)…

当将-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之后,我最近才开始寻找出现这种情况的原因。

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

问题

我有一个包含大约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文件夹。