我试图在创建列表后找到嵌套的 YAML 和 HTML 文件以用 sed 替换字符串;我不确定我是否完全理解如何使用该-prune
选项,这就是我所拥有的:
find . -type f -name '*.yaml' -or -name '*.html' \
-and -path './.git/*' -or -path '*/node_modules/*' -prune
为此我仍然在node_modules
目录下获取 HTML 文件
答案1
如果您想从搜索树中删除任何名为.git
或的目录,您可以使用node_modules
-type d \( -name .git -o -name node_modules \) -prune
这将导致find
甚至无法进入这些目录(这-type d
并不是严格必要的,但我将在这里使用它来与-type f
; 对称,请参见下文)。
然后你会添加其他条件,
-type d \( -name .git -o -name node_modules \) -prune -o \
-type f \( -name '*.yaml' -o -name '*.html' \) -print
结束于
find . \
-type d \( -name .git -o -name node_modules \) -prune -o \
-type f \( -name '*.yaml' -o -name '*.html' \) -print
您想要对通过所有测试的路径名采取的任何操作都应该代替-print
.
请注意,两个谓词之间的默认逻辑运算是-a
(AND)。
答案2
man find
是查找有关 find 的更多信息的好地方。
这应该对你有用。
find . \
-type f \
'(' -name '*.yaml' -or -name '*.html' ')' -and \
-not '(' -path './.git/*' -or -path '*/node_modules/*' ')'
请注意括号的使用,以及需要引用它们,因为它们是 bash(以及大多数其他 shell)的固有内置语法。