为每个项目自定义 grep 排除目录

为每个项目自定义 grep 排除目录

我很好奇是否有人有办法为您工作的每个不同代码库自动生成一组不同的--exclude-dir标志。grep

因为在一个项目中,我永远不想在目录中搜索output/,而在另一个项目中,我永远不想在checkpoints/目录中搜索。由于代码库中经常有一些文件夹包含非源代码,因此我总是必须手动输入这些文件夹(例如grep --exclude_dir {onedir, twodir, threedir} ...

理想情况下,对于我所在的任何代码库,我都可以在其中包含一个文件,grep 可以查看该文件,以了解--exclude-dir每当我grep从命令行调用时自动填充选项的内容。这样我就不必每次都输入一长串要排除的目录名称,这些名称根据我当前正在处理的项目而有所不同。

如果它可以从现有的中读取.gitignore也可以。

答案1

我建议使用ripgrep代替grep。它具有的众多优点之一是

默认情况下,ripgrep 将遵守 gitignore 规则并自动跳过隐藏文件/目录和二进制文件

所以它不仅会尊重.gitignore当前目录中的文件,还会尊重.gitignoregit 使用的全局文件。

要默认禁用所有自动过滤,请使用rg -uuu

答案2

以下脚本对我有用

#!/bin/bash

if [ -r .grepignore ]; then
    while read -r line; do
        if [[ "$line" =~ '#' ]] || [[ "$line" =~ ^$ ]]; then
            continue
        fi
        EXCLUDE="$EXCLUDE --exclude-dir=\"$line\""
    done < .grepignore
fi

eval grep -r "$EXCLUDE" '"$@"'

该脚本检查文件是否.grepignore存在并且可读。如果是这样,它会为该文件中的任何行构造一个EXCLUDE包含, 的字符串(没有前导和尾随空格),前提是它不为空或包含.然后,该脚本将该字符串传递给并添加您为脚本提供的参数。--exclude-dir="$line"$line#EXCLUDEgrep

为了执行脚本,请将代码保存在文件中mygrep,使用 使其可执行chmod +x /path/to/mygrep,并使用 调用它/path/to/mygrep,后面跟着您要提供的任何选项grep,当然还有搜索词。

答案3

看来这面--exclude-from=FILE旗帜正是您要找的。您必须使用FILE以下条目手动创建和填充每个特定于项目的条目:

onedir/*
twodir/*

为了方便起见,你还可以创建一个 shell 别名,以便运行时grep会自动调用该--exclude-from=FILE标志。

相关内容