#bash #shell #sh
#баш #оболочка #sh
Вопрос:
Я пытаюсь запустить скрипт для преобразования изображений в формат webp. Все хорошо, но мой скрипт не работает, когда в имени файла (или целой папки) есть пробелы.
Я использую Imagemagik (Ubuntu 16.04) для преобразования изображений в копию webp в том же месте (и сохраняю то же имя файла). Важно сохранить одно и то же имя файла, расположение файла и использовать рекурсивное исследование для сжатия всех файлов.
Например, при запуске скрипта:
изображения/cmsA/fileA.png копируются и преобразуются в изображения/cmsA/fileA.webp
но
изображения/cmsB/файл A.png
или
изображения/cms B/fileA.png
не обращены.
Я знаю, что с моими аргументами что-то не так (или где-то «отсутствует», я пытался их вставить, но, думаю, я сделал это неправильно)
У кого-нибудь есть решение?
Вот мой скрипт:
Спасибо 🙂
#!/bin/bash
# Convert all images to WebP
IMAGE_PATHS="img/ motor/ motor2/ modules/"
for SRC in $(find $IMAGE_PATHS -name "*.png" -o -name "*.jpg" -o -name "*.jpeg" -o -name "*.gif"); do
WEBP="${SRC%.*}.webp"
if [ "$SRC" -nt "$WEBP" ]; then
echo "Converting to $WEBP"
convert "$SRC" -define webp:alpha-compression=1 -define webp:auto-filter=true -define webp:alpha-quality=90 -quality 95 "$WEBP"
fi
done
Редактировать: Решение моей проблемы благодаря @alecxs
#!/bin/bash
# Convert all images to WebP
IMAGE_PATHS="img/ modules/"
find $IMAGE_PATHS -type f ( -iname "*.png" -o -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.gif" ) -print0 | sort -z | while read -r -d $'' SRC;
do
WEBP="${SRC%.*}.webp"
if [ "$SRC" -nt "$WEBP" ]; then
echo "Converting to $WEBP"
convert "$SRC" -define webp:alpha-compression=1 -define webp:auto-filter=true -define webp:alpha-quality=90 -quality 95 "$WEBP"
fi
done
Комментарии:
Ответ №1:
чтобы захватить все имена файлов, независимо от того, какие символы они содержат, вы можете использовать символ NUL в качестве разделителя для встроенного чтения в сочетании с циклом while (и сортировки, если требуется).
пожалуйста, обратите внимание, что имена файлов чувствительны к регистру, вы должны преобразовать строки в нижний регистр с помощью манипуляций со строками перед сравнением. чтобы захватить все файлы, используйте find -iname .
find $IMAGE_PATHS -type f ( -iname "*.png" -o -iname "*.jpg" -o -iname "*.jpeg" -o -iname *.gif" ) -print0 | sort -z | while read -r -d
Комментарии:
1. извините, я не понял, что такое -nt для [ FILE1 -nt FILE2 ]True, если FILE1 был изменен позже, чем FILE2, или если FILE1 существует, а FILE2 нет
2. Привет, спасибо за вашу помощь, все работает как по маслу!
' SRC
do
...
# if [ "${SRC,,}" != "${WEBP,,}" ]
if [ "$SRC" -nt "$WEBP" ]
...
done
Комментарии:
1. извините, я не понял, что такое -nt для [ FILE1 -nt FILE2 ]True, если FILE1 был изменен позже, чем FILE2, или если FILE1 существует, а FILE2 нет
2. Привет, спасибо за вашу помощь, все работает как по маслу!