일일 사용량은 다음과 같습니다.
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
그리고 -H
GNU 확장입니다).
사용:
mygrep pattern dir1 dir2
dir1
( 그리고 술어 dir2
처럼 보이지 않는지 확인하세요 ).find
-exec sh...+
이러한 경고 메시지가 마음에 들지 않으면 삭제하세요.
동작을 크게 변경할 때 grep
별칭으로 사용하는 것은 좋지 않습니다 .
옵션을 에 전달해야 하는 경우 다음과 같은 변수를 grep
사용할 수 있습니다 GREP_OPTIONS
.
GREP_OPTIONS=-i mygrep foo dir
그러나 이 옵션에 대한 지원은 향후 버전에서 제거될 예정이므로 옵션을 전용 배열에 전달하는 grep
방법을 제공하는 것이 더 나은 옵션일 수 있습니다 (셸에서 지원하는 경우).mygrep
grep
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 -- dir
mygrep -f patternfile -- dir