이미지를 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
.-r
rm
이제 스크립트는 명령줄에서 여러 디렉터리 가져오기도 지원합니다.
를 사용 하지 않고 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