특정 유형이고 특정 문자열을 포함하지 않는 모든 파일을 찾으려고 합니다. grep -v에 find를 연결하여 문제를 해결하려고 합니다.
예:
find -type f -name '*.java' | xargs grep -v "something something"
이것은 작동하지 않는 것 같습니다. find 명령으로 찾은 모든 파일을 반환하는 것 같습니다. 내가 하려는 것은 기본적으로 특정 파일 이름(예: SessionPb.java에서와 같이 'Pb'로 끝남)과 일치하고 내부에 'extends SomethingSomething'이 없는 모든 .java 파일을 찾는 것입니다.
내 의심은 내가 잘못하고 있다는 것입니다. 그렇다면 명령은 어떻게 생겼을까요?
답변1
여기 에는 필요가 없습니다 xargs
. 또한 옵션(일치하지 않는 파일) grep
과 함께 사용해야 합니다 -L
. 그렇지 않으면 예제에서처럼 이름 대신 파일 내용이 출력됩니다.
find . -type f -iname "*.java" -exec grep -L "something somethin" {} \+
답변2
정말 거의 다 됐어요...
find . -type f -iname "*.java" -print0 | xargs -0 grep -v "something something"
점 '.' 여기서부터 시작하라고 하네요. (당신은 그것을 암시하지만 .. 결코 가정하지 마십시오).
-iname경우에 따라(또는 대소문자가 없는 경우) 대소문자를 구분하지 않는 검색을 사용합니다.
-인쇄0후행 \x00 문자를 사용하여 파일 이름을 xargs로 보내 파일 이름에 공백이 있는 문제를 방지합니다.
xargs의 '-0'은 반환 대신 \x00으로 끝나는 파일 이름을 예상한다는 의미입니다.
그리고 당신의 grep 명령 ...
꽤 많이 얻었습니다.
편집하다::
업데이트 내용:
find . -type f -iname "*pb.java" -print0 | xargs -0 grep -iL "something"
도움이 될 것입니다. (@rush의 답변에 -L을 추가했습니다. 잘하셨습니다)
귀하의 grep에는 '-i' 옵션이 필요하거나 덜 명시적이어야 한다는 생각이 듭니다.
명령을 부분적으로 시도해 보십시오... 이 출력 파일 이름이 적절해 보이나요?
find . -type f -iname "*pb.java"
그렇다면 문제는 grep 검색 패턴이 일치하지 않거나(철자 오류? 발생합니다!) 일치하는 항목이 없을 가능성이 높습니다.
절대 최악의 경우:
grep -riL "something" *
모든 것을 검색하는 데 훨씬 더 많은 작업을 수행하지만 일부 결과를 제공해야 합니다.
답변3
컴퓨터는 컴퓨터입니다. 컴퓨터는 사용자가 원하는 작업 대신 사용자가 지시한 작업을 수행합니다.
grep -v "something something"
를 포함하지 않는 모든 줄을 인쇄합니다 something something
. 예를 들어 다음 세 줄 중 두 줄을 인쇄합니다.
hello world
this is something something
something else
extends SomethingSomething
어디에도 포함되지 않은 파일을 인쇄하려면 다음 -L
옵션을 사용하십시오.
grep -L -E 'extends[[:space:]]+SomethingSomething' FILENAME…
일부 grep 버전에는 옵션이 없습니다 -L
.POSIX). 그렇지 않은 경우 아무것도 인쇄하지 않고 반환 코드를 사용하여 호출 쉘이 대신 수행해야 하는 모든 작업을 수행하도록 합니다.
grep -q -E 'extends[[:space:]]+SomethingSomething' FILENAME ||
echo "$FILENAME"
또는 awk를 사용하세요.
awk '
FNR == 1 && NR != 1 && !found { print fn }
FNR == 1 { fn = FILENAME; found = 0; }
/extends[[:space:]]+SomethingSomething/ { found = 1 }
END { if (fn != "" && !found) print fn }
'
Linux나 Cygwin(또는 GNU grep을 사용하는 다른 시스템)에서는 반복이 가능하므로 를 find
사용할 필요가 없습니다 .grep
grep -R --include='*.java' -L -E 'extends[[:space:]]+SomethingSomething'
쉘이 ksh, bash 또는 zsh인 경우 쉘이 파일 이름 일치를 수행하도록 할 수 있습니다. Bash에서는 set -o globstar
먼저 실행하십시오(이것을 에 넣을 수 있습니다 ~/.bashrc
).
grep -L -E 'extends[[:space:]]+SomethingSomething' **/*.java
답변4
find -type f -name '*.java' 2>&1 | grep -v "something something"
"grepping out"하는 내용은 stdout이 아닌 stderr에 표시됩니다.
위의 명령은 stderr를 stdout으로 리디렉션합니다.