grep이 'No such file or directory'오류를 출력하지 않게하려면 어떻게해야합니까?


215

나는 git이 관리하는 큰 코드 더미를 파고 들고 grep을 할 때마다 다음과 같은 형식의 메시지 더미를 봅니다.

> grep pattern * -R -n
whatever/.git/svn: No such file or directory

그 라인을 없앨 수있는 방법이 있습니까?


1
요즘 ag에는 ack, 또는을 사용하는 것이 좋습니다 . 코드 리포지토리를 검색하는 cgrep것보다 훨씬 빠릅니다 grep.
lunixbochs

코드를 살펴보고 특정 디렉토리를 피하려는 경우 ack을 살펴보십시오. 소스 코드 인식 grep이므로 이러한 VCS 디렉토리 (vi 및 emacs 백업, 비 소스 파일 등)를 적극적으로 무시합니다.
Brian Agnew

2
사용자 No such file or directory는 존재하는 파일 및 / 또는 디렉토리에 대한 메시지를 어떻게 얻을 수 있습니까? 또는 반대로 grep *존재하지 않는 파일 이름을 얻는 방법은 무엇입니까? 이것이 grep실행되는 동안 다른 프로세스가 디렉토리 트리를 조작 (파일 작성, 이름 바꾸기 및 삭제)하는 경합 조건 입니까?
Scott

답변:


299

-s또는 --no-messages플래그를 사용하여 오류를 억제 할 수 있습니다 .

-s, --no-messages는 오류 메시지를 표시하지 않습니다

grep pattern * -s -R -n

14
@Alex @Dogbert 이것은 질문에 대답하지만 '-s'는 grep과 함께 xargs를 사용할 때 문제를 숨길 수 있습니다. '일부 텍스트'문자열을 포함하는 디렉토리 'aaa.txt'및 'a b.txt'에 두 개의 파일을 작성하십시오. 이 명령 /bin/ls -1 | xargs grep 'some text'은 'a b.txt'를 2 개의 인수로 나누기 때문에 "이러한 파일이나 디렉토리가 없습니다"를 제공합니다. 억제하면 파일을 놓친 것을 알 수 없습니다.
켈빈

@Kelvin, 예를 들어 사용 find하고 print0함께 사용 xargs -0하면 문제가 해결됩니까? 감사합니다
Luka

1
@Luka 문제를 해결해야합니다. 이러한 NUL 옵션을 항상 사용하면 문제가 발생하지 않지만 그렇지 않은 경우 가장 부적절한 시간에 잊어 버릴 것입니다 (IMHO).
Kelvin

이것은 다른 옵션 (--quiet)이없는 Mac OS X에서 작동합니다.
philshem

59

git 저장소를 통해 grepping하는 경우을 사용하는 것이 좋습니다 git grep. 당신은 -R경로 를 전달할 필요가 없습니다 .

git grep pattern

현재 디렉토리의 모든 일치 항목이 아래로 표시됩니다.


5
유용한 git 특정 명령의 경우 +1 svn에서는 작동하지 않습니다 :-)
cadrian

2
+1 이것은 내가 놓친 git 명령이다-이것은 커밋에서 ( "pattern"뒤에 커밋을 추가함으로써) 트리의 상태에서 문자열을 grep하게한다.
켈빈

1
도망자 플러그인을 사용하면 Ggrep현재 디렉토리 대신 Git 디렉토리의 맨 위에서 시작하여 검색합니다.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

이것은 표준 grep보다 훨씬 빠릅니다. (아마도 이진 파일 등을 무시합니까? 모르지만 유용합니다.)
Daniel

10

이와 같은 오류는 일반적으로 "표준 오류"스트림으로 전송되며 파일로 파이프하거나 대부분의 명령에서 사라질 수 있습니다.

grep pattern * -R -n 2>/dev/null

질문에 대답하지만 문제를 숨길 수 있습니다. Dogbert의 답변 아래 내 의견을 참조하십시오.
켈빈

5

링크가 끊어지면 (존재하지 않는 파일을 가리키는 심볼릭 링크) 여러 번 발생하는 grep은 존재하지 않는 대상 파일을 검색하려고 시도합니다 (따라서 정확하고 정확한 오류 메시지).

일반적으로 콘솔을 통해 sysadmin 작업을 수행하는 동안 귀찮게하지 않지만 스크립트 내에서 "find"가있는 텍스트 파일을 찾은 다음 각 항목을 grep합니다.

find /etc -type f -exec grep -nHi -e "widehat" {} \;

대신에:

grep -nRHi -e "widehat" /etc

4

나는 일반적으로 grep이 재귀 자체를 수행하지 못하게합니다. 일반적으로 건너 뛸 디렉토리가 몇 개 있습니다 (.git, .svn ...).

다음과 같은 자세로 영리한 별칭을 수행 할 수 있습니다.

find . \( -name .svn -o -name .git \) -prune -o -type f -exec grep -Hn pattern {} \;

언뜻보기에는 과도하게 보일 수 있지만 일부 패턴을 필터링해야 할 때 매우 편리합니다.


1
+1. 이것은 오류를 억제하는 것보다 훨씬 낫습니다. 그러나 나는 당신이 -exec당신의 grep 을 잊어 버렸다고 생각합니다 .
켈빈

1
이것은 무엇을 의미 하는가? \( -name .svn -o -name .git \)
sbhatla

grep의 --exclude 또는 --exlcude-dir 플래그를 사용하지 않는 이유는 무엇입니까?
Choylton B. Higginbottom

1
@sbhatla 괄호는 find 명령의 조작 순서를 작성합니다. stackoverflow.com/questions/24338777/…
Choylton B. Higginbottom

4

xargs 에서 -0옵션 을 사용해 보셨습니까 ? 이 같은:

ls -r1 | xargs -0 grep 'some text'

2
-print0find -print0 | xargs -0 grep 'text'
aliva

1

-Igrep에서 사용하십시오 .

예 : grep SEARCH_ME -Irs ~/logs.


1
-I이진 파일을 건너 뜁니다 --binary-files=without-match. "No such file or directory"메시지는 표시하지 않습니다.
mwfearnley

0

나는 리디렉션 stderrstdout다음 사용 그렙의 반전 경기는 ( -v) I 숨기려한다는 경고 / 오류 문자열을 제외 :

grep -r <pattern> * 2>&1 | grep -v "No such file or directory"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.