아무것도 발견되지 않을 때 찾기가 실패하도록 만들기

아무것도 발견되지 않을 때 찾기가 실패하도록 만들기

호출 시 find파일을 찾을 수 없으면 여전히 코드 0으로 종료됩니다. 파일을 찾을 수 없을 때 실패를 나타내는 종료 코드를 반환하도록 하는 방법이 있습니까?

답변1

grepNUL로 구분된 줄(예: GNU's grep) 읽기를 지원하는 경우 -z이를 사용하여 출력되는 항목이 있는지 테스트할 수 있습니다 find.

find /some/path -print0 | grep -qz .

데이터를 다른 명령으로 파이프하려면 옵션을 제거하여 데이터를 변경하지 않고 그대로 -q두고 grep결과가 없으면 오류를 보고할 수 있습니다.

find /some/path -print0 | grep -z . | ...

특히 ${PIPESTATUS[1]}종료 상태는 bash 에 저장되어야 합니다 grep.

find이를 지원하지 않으면 grep -print0없이 사용 -z하고 파일 이름에 줄바꿈이 문제를 일으키지 않기를 바랍니다.

find ... | grep '^' | ...

이 경우 ^대신 사용하는 것이 .더 안전할 수 있습니다 . 출력에 연속적인 개행 문자가 있으면 ^무시되지만 .그렇지는 않습니다.

답변2

구체적으로 반환 코드를 요청하셨습니다. 옵션에 해당 항목이 표시되지 않습니다. 하지만 이것이 내가 해결한 방법입니다( grep -zMac 포트에서는 아니기 때문에).

1개의 행이 발견되면 코드 0을 제공하십시오.

test 1 == `find */.kitchen/ -name private_key | wc -l`

그래서...

if [ 0 == `find */.kitchen/ -name my-file.txt | wc -l` ] ; then
   echo "Nothing found"; exit;
fi

또한 일반적인 솔루션으로 다음이 유용할 수 있습니다.

파이프가 비어 있는지 확인하고 비어 있으면 데이터에 대해 명령을 실행하십시오.

답변3

나는이 질문에 매우 늦었지만 방금 우아한 답변을 찾았습니다 :-)

find . -type d -empty -and -not -name . -print -exec rmdir {} + | \
  awk '{print} END {if (NR == 0) {exit(1)}}'

find여기서는 현재 디렉터리에서 빈 디렉터리를 찾고,
빈 디렉터리를 삭제하고,
삭제된 디렉터리의 이름을 파이프에 인쇄하고,
awk출력을 인쇄하고 , find출력이 없으면 NR == 0오류 코드와 함께 종료됩니다 .

이는 이제 빈 디렉터리를 반복할 수 있음을 의미합니다.

while find . -type d -empty -and -not -name . -print -exec rmdir {} + | \
  awk '{print} END {if (NR == 0) {exit(1)}}'; \
do echo; done

"my" find매개변수를 원하는 것으로 바꾸고, 터미널에 표시되는 출력을 원하지 않으면 해당 부분을 유지 awk하거나 해당 부분을 유지하지 않으면 "voila"가 됩니다.{print}find

관련 정보