使用zsh globbing进行grepping时排除目录

时间:2016-12-06 23:04:08

标签: linux zsh glob oh-my-zsh

我有一些文件结构,其中包含具有不同深度的构建文件夹的项目。我正在尝试使用zsh(扩展)globbing来排除构建文件夹中的文件。

我尝试使用以下命令和许多其他变体:

grep "string" (^build/)#

我将其视为“任何与build不匹配的文件夹0次或更多次。”

但是我仍然可以从以下文件夹中获得结果:

./项目A /构建/.../ file.mi

./项目B /包/建立/.../ file2.mi

有什么建议吗?

3 个答案:

答案 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替代品做同样的事情:

答案 2 :(得分:0)

使用glob限定符e为我做了诀窍,对于' grep'和' ls':

grep -s "string" **/*(e[' [[ ! `echo "$REPLY" | grep "build/" ` ]]'])