-exec
find 옵션에 대한 인수 로 파이프 명령을 사용할 수 있습니까 ? 즉, 다음과 같은 작업을 수행하고 싶습니다.
find . -name CMakeLists* -exec cat '{}' | grep lib \;
각 파일에 대해 시도해 보았지만 cat '{}' | grep lib
작동하지 않습니다. 따옴표도 작동하지 않습니다. 누구든지 제안이 있나요?
고쳐 쓰다:
구체적인 질문에 대한 답변이 완료되었습니다. 이제 유니버설 패턴을 작동시킬 수 있는 방법이 있습니까 find <path> -type f -name <name> -exec <pipeline-command>
?
답변1
find . -type f -name "CMakeLists*" -exec grep lib /dev/null {} +
이 발견문서현재 디렉터리에서 기본 이름은 문자열 또는 로 시작됩니다 CMakeLists
. 인수 find
는 실행하기 전에 쉘이 인수를 확장하지 않도록 이스케이프 처리됩니다(큰따옴표) .
cat
파이프를 추가할 필요가 없습니다 grep
. 여기서는 쓸모없는 IO가 있는 쓸모없는 프로세스입니다. 일치하는 파일이 여러 개인 경우 파일 이름이 일치하는 줄과 함께 보고되도록 /dev/null
추가 되었습니다 .grep
{} +
여러 파일 이름은 인수로 사용되는 종료 시퀀스를 통해 각 명령 호출 -exec
에 전달됩니다 . grep
우리가 {} \;
사용한다면grep
모든파일을 찾았습니다. 불필요한 프로세스 인스턴스화를 수백 또는 수천 번 수행하면 비용이 많이 듭니다.
매개변수가 있는 파이프를 사용하려면 find
-exec
쉘을 호출해야 합니다. 인위적인 예로 grep
문자열 "one"이 있을 수 있지만 문자열 "two"도 존재하지 않는 경우에만 해당됩니다. 이는 다음과 같이 수행할 수 있습니다.
find . -type f -name "CMakeLists*" -exec sh -c 'grep one "$@"|grep -v two' sh {} +
이는 아래 @muru, @Serg 및 @Scott의 의견을 바탕으로 작성되었습니다. 감사합니다.
답변2
첫째, 이것은 find 명령이 종료되는 방식이 아닙니다.
둘째, cat
로 직접 대체할 수 있습니다 grep lib
.
find . -name CMakeLists* -exec grep lib '{}' \;
이는 기본적으로 모든 검색 결과에서 "grep lib"를 의미합니다. {} 주위의 체크 표시를 생략할 수도 있습니다. 작동해야합니다.