Есть однострочник:
for f in oldpath/*.png; do convert "$f" $PARAMETERS "newpath/`basename "$f" .png`.webp"; done
Он работает в 1 поток. Можно запускать каждую команду отдельным процессом:
for f in oldpath/*.png; do convert "$f" $PARAMETERS "newpath/`basename "$f" .png`.webp" & done
Но памяти хватает файлов на 300, если больше — всё прибивается по OOM.
Я хотел использовать GNU parallel, точнее sem:
for f in oldpath/*.png; do sem -j8 convert "$f" $PARAMETERS "newpath/`basename "$f" .png`.webp" & done
Но как выяснилось, если в $f есть пробелы, convert получит его без кавычек и не сможет работать.
Вопрос: как принято передавать имена с пробелами пробелы таким утилитам, как sem?
Ответ:
У sem и parallel есть параметр --quote
или -q
.
for f in oldpath/*.png; do sem -q -j8 convert "$f" $PARAMETERS "newpath/`basename "$f" .png`.webp" & done
Но я всё ещё жду ответов о возможности более общего решения. Например, утилиты вроде tr или sed, автоматически экранирующей строки.