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

관련 정보