일일 사용량은 다음과 같습니다.
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