찾기 위해 -exec 인수로 파이프

찾기 위해 -exec 인수로 파이프

-execfind 옵션에 대한 인수 로 파이프 명령을 사용할 수 있습니까 ? 즉, 다음과 같은 작업을 수행하고 싶습니다.

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"를 의미합니다. {} 주위의 체크 표시를 생략할 수도 있습니다. 작동해야합니다.

관련 정보