"def test"를 포함하는 모든 Python 테스트 스크립트를 나열하고 싶습니다.
명령줄은 작동하지 않지만 단일 명령은 작동합니다.
find . -name "*.py" | grep "def test"
답변1
노력하다:
grep -r --include '*.py' 'def test'
-r
grep에게 파일을 재귀적으로 검색하도록 지시--include '*.py'
로 끝나는 이름만 확인하도록 grep에 지시합니다.py
.
--include
둘 다 이 옵션을 지원합니다.GNU(리눅스) grep그리고MacOS grep
파이프라인 방법에 대한 토론
다음 명령에서 find는 발견된 파일의 이름을 grep의 표준 입력에 전달합니다.
find . -name "*.py" | grep "def test"
여기서 문제는 grep이 표준 입력을 검색할 텍스트로 취급한다는 것입니다. 따라서 유일한 출력은 해당 파일입니다.이름(콘텐츠와 반대)에는 def test
.
예를 들어 빈 파일을 만들어 보겠습니다.
$ touch 'def test.py'
파이프라인 명령을 실행합니다.
$ find . -name "*.py" | grep "def test"
./def test.py
이 명령은 이름을 기준으로 파일을 찾습니다. 그 내용은 검토된 적이 없습니다.
답변2
find . -name '*.py' -exec grep -l 'def test' {} \;
또는
find . -name '*.py' -exec grep -l 'def test' {} +
grep
두 번째 버전은 파일 세트를 인수로 지정하여 호출을 줄입니다.
답변3
grep -ril 'def test' .
위의 명령은 찾고 있는 내용을 나열합니다.
명령에서 - 옵션 ril은 재귀적(r) 대소문자를 구분하지 않음(i) 검색 및 나열만(l) 파일 이름을 나타냅니다.
답변4
찾은 파일에서 명령을 실행하는 표준 방법은 find
xargs를 사용하는 것입니다.
find . -name "*.py" | xargs grep "def test"
grep의 경우 다른 답변에서 설명하는 것처럼 find + grep 대신 재귀 grep을 사용할 수 있지만 xargs는 다른 사용 사례에도 사용할 수 있는 일반적인 접근 방식이므로 알아두는 것이 좋습니다.
(Doug O'Neal이 언급했듯이: 파일 이름에 공백이 있으면 find 및 xargs에 널 문자를 종결자로 사용하도록 지시해야 합니다 find . -name "*.py" -print0 | xargs -0 grep "def test"
. :)