질문:
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
의 옵션은 다음과 같습니다.find
man
-exec command ;
Execute command; true if 0 status is returned....
"상태 0이 반환되면 true"라는 특정 진술을 이해하지 못합니다. 이는 find
특정 파일에 대한 명령 실행이 0 상태를 반환하면 해당 파일이 일치(true`)로 간주된다는 의미입니까 ? 이것이 문제를 해결하는 데 도움이 됩니까?
질문:
쉘 스크립트를 작성하지 않고 이를 수행하는 가장 쉬운 방법은 무엇입니까? 라이너가 이상적입니다.
답변1
여기서 우리가 하고 싶은 것은 -exec
in이 포함된 파이프를 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
.
관련된: