我有一些文件结构,其中包含具有不同深度的构建文件夹的项目。我正在尝试使用zsh(扩展)globbing来排除构建文件夹中的文件。
我尝试使用以下命令和许多其他变体:
grep "string" (^build/)#
我将其视为“任何与build
不匹配的文件夹0次或更多次。”
但是我仍然可以从以下文件夹中获得结果:
./项目A /构建/.../ file.mi
./项目B /包/建立/.../ file2.mi
有什么建议吗?
答案 0 :(得分:2)
这应该有效:
grep string (^build/)#*(.)
^build
:任何未命名的build
^build/
:任何目录未命名为build。它不匹配任何其他文件类型(^build/)#
:由未命名为build
的元素组成的任何目录路径。同样,这与最后一个元素不是目录(^build/)#*
:除最后一个元素外的所有元素都不能命名为build
的任何路径。这也将列出文件。如果文件本身名为build
,它还假定它没问题。如果不是这种情况,则必须使用(^build/)#^build
(^build/)#*(.)
:与之前相同,但仅限于通过glob限定符(.)
匹配普通文件答案 1 :(得分:0)
我认为你不需要让shell参与那项任务; grep
带有自己的文件 - globber。来自PHP manual:
--exclude-dir=GLOB
Skip any command-line directory with a name suffix that matches the pattern GLOB. When searching recursively, skip any subdirectory whose
base name matches GLOB. Ignore any redundant trailing slashes in GLOB.
所以这样的事情应该为你完成工作:
grep -R "string" --exclude-dir='build'
该过滤器将省略名为“build”的子目录;如果你想过滤掉包含字符串“build”的目录(例如“build2”或“test-build”),那么在排除模式中使用globbing:
grep -R "string" --exclude-dir='*build*'
为了完整起见,我还在这里包括如何使用我或多或少熟悉的两个流行的grep
替代品做同样的事情:
ag -G '^((?!build).)*$' string
rg -g '!build'
答案 2 :(得分:0)
使用glob限定符e
为我做了诀窍,对于' grep'和' ls':
grep -s "string" **/*(e[' [[ ! `echo "$REPLY" | grep "build/" ` ]]'])