이미지 변환 bash 스크립트가 작동하지 않습니다

이미지 변환 bash 스크립트가 작동하지 않습니다

이미지를 webp 형식으로 변환할 수 있는 스크립트를 찾았습니다.

#!/bin/bash -x

# converting JPEG images
find $1 -type f -and \( -iname "*.jpg" -o -iname "*.jpeg" \) \
-exec bash -c '
webp_path=$(sed 's/\.[^.]*$/.webp/' <<< "$0");
cwebp -quiet -q 90 "$0" -o "$webp_path";
rm -rf $webp_path;' {} \;

입력으로 제공되는 폴더는 다음과 같습니다.

root@ip-10-0-1-46:/var/images/newlocallego/12345# tree
.
└── 01234
    ├── 001.jpg
    ├── 002.jpg
    ├── index.htm
    └── main.jpg

1 directory, 4 files

나는 처형 중이야./webpconvert.sh /var/images/newlocallego/12345

하지만 webp 파일을 생성하지도 않고 jpg 파일을 삭제하지도 않으며 아무런 오류도 발생하지 않습니다. 뭔가 빠졌어요.

답변1

출력 파일은 생성되는 즉시 삭제됩니다. 또한 bash -c스크립트 주변의 명령 대체에 인용문을 사용하는 데 문제가 있으며 sed전혀 참조되지 않는 일부 변수의 인스턴스가 있습니다.

수정된 변형:

find "$@" -type f \( -iname '*.jpg' -o -iname '*.jpeg' \) -exec bash -c '
    for pathname do
        cwebp -quiet -q 90 -o "${pathname%.*}.webp" -- "$pathname" &&
        rm -f -- "$pathname"
    done' bash {} +

bash -c검색된 파일을 파일당 한 번 호출하는 대신 일괄적으로 호출하면 작업을 더욱 효율적으로 수행할 수 있습니다.

cwebp성공적으로 종료하지 않으면 원본 파일은 삭제되지 않습니다. 파일 이름 접미사는 를 .webp사용하는 대신 표준 인수 대체를 통해 원래 파일 이름 접미사를 대체합니다 sed.-rrm

이제 스크립트는 명령줄에서 여러 디렉터리 가져오기도 지원합니다.

를 사용 하지 않고 find:bash

shopt -s nullglob dotglob nocaseglob
shopt -s globstar

for dirpath do
    for pathname in "$dirpath"/**/*.{jpg,jpeg}; do
        [ ! -f "$pathname" ] && continue
    
        cwebp -quiet -q 90 -o "${pathname%.*}.webp" -- "$pathname" &&
        rm -f -- "$pathname"
    done
done

유일한 차이점은 bash루프가 패턴과 일치하는 일반 파일에 대한 심볼릭 링크도 처리한다는 것입니다. 이것이 문제라면 -f내부 루프의 테스트를 다음으로 변경하십시오.

if [ ! -f "$pathname" ] || [ -h "$pathname" ]; then
    continue
done

관련 정보