따옴표를 이스케이프 처리하는 Bash 스크립트

따옴표를 이스케이프 처리하는 Bash 스크립트

폴더의 모든 이미지를 찾고 ImageMagick을 사용하여 엔딩이 손상되었는지 확인하는 bash 스크립트를 작성 중입니다.

자동화하려는 명령은 다음과 같습니다.

identify -verbose *.jpg 2>&1 | grep "Corrupt" | egrep -o "([\`].*[\'])"

내가 겪고 있는 문제는 인식 명령을 변수에 저장하는 것입니다.

명령에 여러 유형의 따옴표가 있습니다. 오류가 계속 발생합니다.8행: 손상: 명령을 찾을 수 없습니다.

#!/bin/bash
# This script will search for all images that are broken and put them into a text file

FILES="*.jpg"

for f in $FILES
do
  corrupt = "identify -verbose \"$f\" 2>&1 | grep \"Corrupt\" | egrep -o \"([\`].*[\'])\""

  if [ -z "$corrupt" ]
  then
    echo $corrupt
  else
    echo  "not corrupt"
  fi
done

이 명령을 적절하게 이스케이프하는 방법이 있습니까?

고쳐 쓰다:

일부 진행 상황:

#!/bin/bash
# This script will search for all images that are broken and put them into a text file

FILES="*.jpg"

for f in $FILES
do
  echo "Processing $f"
  corrupt="identify -verbose $f 2>&1 | grep \"Corrupt\" | egrep -o \"([\`].*[\'])\""

  if [ -z "$corrupt" ]
  then
    echo $corrupt
  else
    echo  "not corrupt"    
  fi

done

더 이상 오류가 발생하지 않지만 변수를 문자열로 저장하는 것처럼 보입니다.

이 명령을 어떻게 실행할 수 있나요?

업데이트: 약간의 진전이 있었습니다. 이제 명령이 실행 중입니다.

#!/bin/bash
# This script will search for all images that are broken and put them into a text file

FILES="*.jpg"

for f in $FILES
do
  echo "Processing $f"

  corrupt=`identify -verbose $f | grep \"Corrupt\" | egrep -o \"([\`].*[\'])\"`

  $corrupt

  if [ -z "$corrupt" ]
  then
    echo $corrupt
  else
    echo  "not corrupt"    
  fi

done

그러나 파이프의 출력은 별개입니다.

Processing sdfsd.jpg
identify-im6.q16: Premature end of JPEG file `sdfsd.jpg' @ warning/jpeg.c/JPEGWarningHandler/387.
identify-im6.q16: Corrupt JPEG data: premature end of data segment `sdfsd.jpg' @ warning/jpeg.c/JPEGWarningHandler/387.

결승전만 필요해`sdfsd.jpg'끈.

답변1

손상된 이미지를 식별하는 방법을 찾고 있을 수도 있습니다. 도구의 종료 상태를 쉽게 쿼리하여 identify이미지 파일을 인식했는지 확인할 수 있습니다.

#!/bin/sh

for name in *.jpg; do
    if identify -regard-warnings -- "$name" >/dev/null 2>&1; then
        printf 'Ok: %s\n' "$name"
    else
        printf 'Corrupt: %s\n' "$name"
    fi
done

종료 상태는 위에서 identify파일이 손상되었는지 확인하는 데 사용됩니다.-regard-warnings옵션언급한 경고를 오류로 업그레이드하면 유틸리티의 종료 상태에 영향을 미치게 됩니다.

실제 와일드카드 패턴을 변수에 저장할 필요가 거의 없습니다. 일반적으로 도구의 출력을 구문 분석하지 않고 유틸리티의 종료 상태(위에 표시된 대로)를 테스트하여 유틸리티의 성공/실패 상태를 얻을 수 있습니다.

이전 ImageMagick 버전(6.9.12.19를 사용 중) convert의 경우 identify.

#!/bin/sh

for name in *.jpg; do
    if convert -regard-warnings -- "$name" - >/dev/null 2>&1; then
        printf 'Ok: %s\n' "$name"
    else
        printf 'Corrupt: %s\n' "$name"
    fi
done

위의 루프는 각 이미지를 변환하려고 시도하며, 이미지 파일 처리가 실패하면 명령문으로 이를 감지합니다 if. 변환 작업의 결과를 삭제합니다.

관련 정보