我的find命令排除node_modules路径失效,问题出在哪里?
为什么你的find命令没排除掉node_modules里的package.json?
哈哈,这个问题我之前也踩过坑!让我给你掰扯清楚原因,再教你怎么修复。
问题出在哪?
你写的命令是:
find . -path node_modules -prune -o -type f -name "package.json"
核心问题有两个:
-path node_modules匹配不到任何目录:当你用find .遍历的时候,所有路径都是以./开头的(比如顶层的node_modules路径是./node_modules,不是node_modules)。-path是精确匹配整个路径字符串的,所以这个条件根本没命中任何目录,-prune等于白写,自然不会跳过任何node_modules。- 就算命中了顶层node_modules,嵌套的子node_modules也管不住:假设你改成
-path "./node_modules",也只能跳过顶层的node_modules,但里面嵌套的./node_modules/xxx/node_modules这类目录还是会被遍历,它们的package.json照样会被搜出来。
正确的解决办法
要彻底排除所有层级的node_modules目录,推荐两种写法:
写法一:匹配所有名为node_modules的目录(最精准)
find . -type d -name "node_modules" -prune -o -type f -name "package.json" -print
-type d -name "node_modules":匹配任何层级下,名字正好是node_modules的目录(不管它在哪个文件夹里)。-prune:告诉find跳过这些目录,不要进去搜索里面的内容。-o:逻辑或,意思是“前面的条件不满足时,执行后面的操作”。-type f -name "package.json" -print:匹配所有名为package.json的文件,并打印它们的路径。
写法二:匹配所有包含node_modules的路径(更简洁)
find . -path "*/node_modules/*" -prune -o -type f -name "package.json" -print
"*/node_modules/*":用通配符匹配任何路径中包含/node_modules/的条目(也就是所有在node_modules目录下的文件和子目录)。- 后面的逻辑和写法一一致,跳过这些路径,只打印符合要求的package.json。
这两种写法都能完美避开所有node_modules里的文件,只返回你想要的其他路径下的package.json。
内容的提问来源于stack exchange,提问作者MikiBelavista
相关产品推荐
相关产品推荐

