여러 디렉토리를 안전하게 무시하는 grep 별칭

여러 디렉토리를 안전하게 무시하는 grep 별칭

일일 사용량은 다음과 같습니다.

grep -rIn pattern directory

내가 피하고 싶은 파일이 있는데, 그 파일들은 어느 시점에서 다음과 같은 경로가 있는 디렉토리에 있습니다: app/lib/bower/lodash, app/lib/bower/paho-mqtt-js, app/lib/bower/socket-io-client.

이상적인 솔루션은 app/lib/bower/경로를 감지하는 것이지만 어렵습니다. 가능합니까?

나는 다음을 생각해 냈습니다.

alias grep='grep --exclude-dir={lodash,paho-mqtt-js,socket-io-client}'

충분합니다(새로운 항목이 추가되면 유지 관리가 필요하지만). 디렉토리가 grep에 의해 제외된 경우 최소한 stderr에 짧은 경고를 추가하는 방법은 무엇입니까?

답변1

나는 다음을 사용할 것입니다 find:

mygrep() (
  pattern=$1; shift
  find "$@" -type d -path '*/app/lib/bower' -exec sh -c '
    printf >&2 "Warning: ignoring \"%s\" directory\n" "$@"
    ' sh {} + -prune -o -type f -exec grep -IHne "$pattern" {} +
)

( -I그리고 -HGNU 확장임).

로 사용:

mygrep pattern dir1 dir2

(확실히 dir1하고 술어 dir2처럼 보이지 않도록 하세요 find).

-exec sh...+해당 경고 메시지에 관심이 없으면 제거하십시오 .

grep동작을 극적으로 변경할 때 별칭 이름으로 사용하는 것은 좋지 않습니다 .

옵션을 에 전달해야 하는 경우 다음과 같은 변수를 grep사용할 수 있습니다 GREP_OPTIONS.

GREP_OPTIONS=-i mygrep foo dir

그러나 해당 옵션에 대한 지원은 향후 버전에서 제거될 예정 이므로 쉘이 지원하는 경우 전용 배열과 같은 옵션을 전달하는 grep방법을 제공하는 것이 더 나은 옵션일 수 있습니다 .mygrepgrep

mygrep() (
  pattern=$1; shift
  find "$@" -type d -path '*/app/lib/bower' -exec sh -c '
    printf >&2 "Warning: ignoring \"%s\" directory\n" "$@"
    ' sh {} + -prune -o -type f -exec \
    grep -IHne "${g[@]}" "$pattern" {} +
)

g=(-i --exclude-dir=.git); mygrep foo dir1 dir2

또는 옵션이 중지되는 위치를 --알려주는 데 사용합니다.mygrep

mygrep() (
  grep_options=()
  for i do
    grep_options+=("$i")
    shift
    [ "$i" != "--" ] || break
  done
  pattern=${1?need a pattern}; shift
  find "$@" -type d -path '*/app/lib/bower' -exec sh -c '
    printf >&2 "Warning: ignoring \"%s\" directory\n" "$@"
    ' sh {} + -prune -o -type f -exec \
    grep -H "${grep_options[@]}" "$pattern" {} +
)

mygrep -nI --exclude-dir=.git -- pattern dir1 dir2

--(그리고 파일을 제외하려는 경우와 같이 옵션 인수로 전달하지 않도록 하십시오 . 예를 들어 가 아닌 을 --사용하십시오 . 이는 또한 또는 와 같은 사용법도 배제합니다 ).--exclude=----exclude --mygrep -e pattern1 -e pattern2 -- dirmygrep -f patternfile -- dir

관련 정보