使用 find 排除多个路径匹配模式

Tri*_*ian 4 find

在创建列表后,我试图找到嵌套的 YAML 和 HTML 文件以用 sed 替换字符串;我不确定我是否完全理解如何使用该-prune选项,这是我所拥有的:

find . -type f -name '*.yaml' -or -name '*.html' \
    -and -path './.git/*' -or -path '*/node_modules/*' -prune
Run Code Online (Sandbox Code Playgroud)

我仍然在node_modules目录下获得 HTML 文件

Kus*_*nda 7

如果您想修剪任何从搜索树中调用.gitnode_modules从搜索树中调用的目录,您可以使用

-type d \( -name .git -o -name node_modules \) -prune
Run Code Online (Sandbox Code Playgroud)

这将导致find甚至不输入这些目录(这-type d不是绝对必要的,但我将在此处使用它以与 对称-type f;见下文)。

然后你会添加其他条件,

-type d \( -name .git -o -name node_modules \) -prune -o \
-type f \( -name '*.yaml' -o -name '*.html' \) -print
Run Code Online (Sandbox Code Playgroud)

结束于

find . \
    -type d \( -name .git -o -name node_modules \) -prune -o \
    -type f \( -name '*.yaml' -o -name '*.html' \) -print
Run Code Online (Sandbox Code Playgroud)

您希望对通过所有测试的路径名执行的任何操作都应代替-print.

请注意,两个谓词之间的默认逻辑运算是-a(AND)。


Wil*_*ley 6

man find
Run Code Online (Sandbox Code Playgroud)

是查找有关 find 的更多信息的好地方。

这应该对你有用。

find . \
    -type f \
    '(' -name '*.yaml' -or -name '*.html' ')' -and \
    -not '(' -path './.git/*' -or -path '*/node_modules/*' ')'
Run Code Online (Sandbox Code Playgroud)

请注意括号的使用,以及需要引用它们,因为它们是 bash(以及大多数其他 shell)的固有内置语法。

  • 谢谢您的回答,我确实使用了手册,但是我发现“-prune”的解释和用法有点令人困惑。 (2认同)