find가 특정 파일을 찾은 경우 내장 쉘을 실행하는 방법

find가 특정 파일을 찾은 경우 내장 쉘을 실행하는 방법

일반적으로 특정 사양과 일치하는 파일이 식별되면 명령을 실행하려면 를 find사용할 수 있습니다 -exec. 그러나 제 경우에는 find일치하는 항목이 발견되면 쉘/스크립트를 종료하고 싶지만 -exec그렇게 할 수 없습니다. [ find확실히-exec bash 함수를 호출할 수도 없습니다..)

예를 들어, 트리를 삭제하는 스크립트에서 빈 디렉터리만 포함된 경우에만 디렉터리가 아닌 항목이 있는지 먼저 확인하고 예기치 않은 첫 번째 항목에 대한 오류 메시지와 함께 중단하고 싶습니다.

지금까지 이와 같은 작업을 수행해야 할 때마다 출력을 변수에 넣고( -quitwith 를 사용하여 find) 비어 있는지 테스트했습니다.

내 스크립트는 다음과 같습니다.

#! /bin/sh
INTRUDER="$(find "$@" ! -type d -print -quit)"
if [ -n "$INTRUDER" ] ; then
    echo "Found non-dir $INTRUDER; leaving the arguments untouched"
    exit 1
fi
rm -R "$@"

이보다 다른/더 좋은 방법이 있나요? "더 좋다"는 것은 코드가 더 작고 이식성이 높다는 것(위에서 언급한 이식성 문제가 있는 경우) 등을 의미합니다. "다르다"는 것은 추가 변수를 피하고 그 길이를 테스트한다는 의미입니다.

답변1

이것은 나에게 효과적입니다.

find "$@" ! -type d -exec kill -9 $$ \; -quit && rm -R "$@"
  • find정상적으로 종료 되면 (아무것도 발견되지 않음) rm -R "$@"실행됩니다.
  • 무언가가 발견 되면 find현재 쉘/스크립트가 종료됩니다( $$pid가 저장됨). 이 경우 - 부분은 rm절대 실행되지 않습니다.

관련 정보