표현식이나 명령을 사용하여 필터 찾기

표현식이나 명령을 사용하여 필터 찾기

질문:

find쉘 표현식으로 표현된 모든 조건을 만족하는 파일(경로) 세트를 인쇄하려면 명령이나 대체 방법을 사용하십시오.

전임자:ca.crt라는 인증서 파일이 있고 해당 OU(조직 단위)는 openshift일 수 있습니다. 다음 표현식은 true인 경우 상태 코드 0을 반환하고, 그렇지 않으면 0을 반환합니다.

openssl x509 -in ca.crt -text -noout 2>/dev/null | grep "OU = openshift" > /dev/null

find이 표현식과 명령을 사용하여 주어진 디렉터리 트리에서 조직 단위가 "openshift"인 모든 인증서 파일을 찾으려면 어떻게 해야 합니까 ?

나는 본 적이:

페이지 -exec의 옵션은 다음과 같습니다.findman

-exec command ;
              Execute command; true if 0 status is returned....

"상태 0이 반환되면 true"라는 특정 진술을 이해하지 못합니다. 이는 find특정 파일에 대한 명령 실행이 0 상태를 반환하면 해당 파일이 일치(true`)로 간주된다는 의미입니까 ? 이것이 문제를 해결하는 데 도움이 됩니까?

질문:

쉘 스크립트를 작성하지 않고 이를 수행하는 가장 쉬운 방법은 무엇입니까? 라이너가 이상적입니다.

답변1

여기서 우리가 하고 싶은 것은 -execin이 포함된 파이프를 find테스트로 사용하는 것입니다. 즉, 다음과 같습니다.

find /search/path -type f -name ca.crt -exec something {} \; -print

경로 이름을 인쇄해야 하는 경우 something종료 상태 0을 반환합니다.

이제 파이프를 직접 사용할 수는 없지만 find다음과 같이 호출할 수 있습니다 sh -c.

find /search/path -type f -name ca.crt -exec sh -c '
    openssl x509 -in "$1" -text -noout 2>/dev/null |
    grep -F -q "OU=openshift"' sh {} \; -print

여기서 일어나는 일은 파이프라인을 실행하기 위해 find인라인 sh -c스크립트가 호출된다는 것입니다(약간만 변경했습니다). 파이프가 0 종료 상태로 종료되면( grep -q출력에서 텍스트 모드가 발견된 경우 수행됨 openssl) -print적용되고 ca.crt해당 이름을 가진 일반 파일의 경로 이름을 인쇄합니다.

파일의 경로 이름은 ca.crt인라인 스크립트로 전달됩니다 $1.


일반적으로 사용하는 대부분의 술어 는 다음 find과 같습니다.시험, 포함하다 -exec. 테스트라면통과하다특정 경로 이름의 경우 다음 테스트가 고려됩니다.

위 명령에서 테스트는 "파일이 일반 파일입니까?"( -type f), "이름이 무엇입니까 ca.crt?"( -name ca.crt), "경로 이름을 대체하여 지금 이 명령을 실행하면 {}종료 상태가 0이 됩니다. ?" ( -exec ... \;). 마지막은 -print언제나진짜-print, 따라서 완료되면 그 이후의 추가 테스트는 항상 완료됩니다.


sh -c각 경로명에 대해 한 번이 아닌 한 번에 많은 경로명에 대해 스크립트를 호출하면 약간 더 효율적으로 만들 수 있습니다. 그런 다음 인라인 스크립트에서 경로 이름을 인쇄합니다.

find /search/path -type f -name ca.crt -exec sh -c '
    for pathname do
        if openssl x509 -in "$pathname" -text -noout 2>/dev/null |
            grep -F -q "OU=openshift"
        then
            printf "%s\n" "$pathname"
        fi
    done' sh {} +

의 경로 이름을 사용하여 루프를 올바르게 제공하는 방법입니다 find.

관련된:

관련 정보