如何让 grep 排除特定路径?

如何让 grep 排除特定路径?

注意:这不是重复的。我正在处理一个特定实例,其中 grep 排除路径/目录的选项没有按预期方式运行。

我正在尝试使用 grep 递归搜索我的根文件系统。我试图排除某些目录,如/proc/sys/usr/local。如果我使用--exclude-dir=${DIR_NAME},那么它不会在以下路径中搜索${DIR_NAME},但这将${DIR_NAME}意味着如果位于当前工作目录以下的级别,它将拒绝搜索下面的路径${DIR_NAME}。例如,考虑这个文件系统树:

${PWD}/
  data/
    settings/
      sys/
    users/
      developer/
        projects/
          my_os/
            build/
            src/
              apps/
              sys/
            Makefile
  extras/
  sys/
    apps/
    os/

如果我希望搜索排除${PWD}/sys和 其下的所有内容,grep -rl --exclude-dir=sys则会将其排除,但它也会排除${PWD}/data/settings/sys${PWD}/users/developer/projects/my_os/src/sys这两个我想包含在搜索中的目录。

我原本希望--exclude-dir/--exclude能够允许使用正则表达式,但我发现此评论表明它们确实如此,但似乎正则表达式语法不会影响实用程序的行为(例如"^/(dev|proc)")。如果这两个选项不使用正则表达式,我没问题,但我不希望将排除模式应用于单个路径组件。有没有办法让它像这样工作?

答案1

只需使用这个:

grep -r "text" | grep -i -v ^sys/ 

您可以根据需要添加任意数量的“| grep -i -v ^dir/”。

相关内容