bash: find -exec 오류 처리

bash: find -exec 오류 처리

나는 잘못된 이미지를 찾기 위해 이 작은 스크립트를 사용하고 있습니다.

find -name '*.jpg' -exec identify -format "%f\n" {} \; 2>errors.txt

훌륭하게 작동하지만 이제 약간 수정해야 합니다. stderr을 error.txt에 덤프하는 것이 아니라 오류를 발생시킨 이미지의 파일 이름(%f)을 덤프하고 싶습니다. 즉, 오류 메시지 목록이 아닌 error.txt에 잘못된 형식의 이미지 파일 목록이 필요합니다.

-exec 섹션에 || echo "%f" >>Errors.txt를 추가하려고 시도했지만 작동하지 않았습니다. 가장 좋은 접근 방식은 무엇입니까?

답변1

잘못된 형식의 이미지를 찾아 해당 이름을 다음 위치에 저장합니다 names.txt.

find -name '*.jpg' -exec bash -c 'identify "$1" &>/dev/null || echo "$1">>names.txt' none {} \;

어떻게 작동하나요?

  • find -name '*.jpg'

    평소대로 시작됩니다 find.

  • -exec bash -c 'identify "$1" &>/dev/null || echo "$1" >>names.txt' none {} \;

    이는 identify각 파일에서 실행되며 identify0이 아닌 오류 코드가 반환되면 파일 이름을 names.txt.

    bash -c '...' none {}bash 쉘이 명령을 따옴표로 묶고 {}위치 인수에 파일 이름을 할당하도록 합니다 $1.

    호기심에 문자열 none이 에 할당되었습니다 $0. $0미사용~하지 않는 한이 경우 bash는 오류를 생성합니다오류 메시지에 프로그램 이름으로 표시됩니다..

논의하다

|| echo "%f" >> errors.txt-exec 부분에 추가를 시도했지만 작동하지 않습니다. 가장 좋은 접근 방식은 무엇입니까?

||미묘한 점은 명령에 따라 행동 해야 한다는 데 있습니다 identify. 이를 수행하려면 위에 표시된 방법을 identify사용하여 쉘 에 넣어야 합니다 .bash -c

답변2

find . -name '*.jpg' -exec sh -c '
  for file do
    if identify "$file"; then
      printf "%s\n" "$file" >&3
    else
      printf "%s\n" "$file" >&4
    fi
  done' sh {} + 3> good 4> bad > /dev/null 2>&1

답변3

그래서 당신은 다음과 같은 것을 원합니다 ...

find . -name '*.jpg'  \
       ! -exec identify -silent {} \; \
       -print 2>/dev/null >errors.txt

관련 정보