Скрипт для пакетного преобразования изображений не работает, когда пробел в имени файла

#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. См. BashFAQ # 20: Как я могу найти и безопасно обрабатывать имена файлов, содержащие новые строки, пробелы или и то, и другое?

Ответ №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. Привет, спасибо за вашу помощь, все работает как по маслу!