Как вы упомянули, не рекомендуется отключать запрос пароля, если только система не работает в определенной защищенной среде.
Одним из возможных решений является вот этот -лайнер, который мне легче запомнить, чем вариант NOPASSWD. Получите права администратора и запустите
$ visudo
и добавьте следующую строку
Defaults: username !authenticate
Это полностью отключит запрос пароля для определенного пользователя.
Лучшее решение в bash :вам не нужно искать:
shopt -s extglob # extended pattern match, you likely already have it set
shopt -s globstar # extended directory level search ('**' matches any directory level)
for f in **/*.@(jpg|jpeg|png|gif)
do
[[ -f "$f.webp" ]] || cwebp -q 80 "$f" -o "$f.webp"
done
Чтобы запустить с parallel
, мы должны избавиться от уже готовых файлов, чтобы мы могли напрямую вызывать cwebp
. Способ - отфильтровать список файлов со списком файлов webp:
printf '%s\n' **/*.@(jpg|jpeg|png|gif) \
| grep -vf <(printf '%s\n' **/*.webp | sed 's/\.webp$//') \
| parallel -i cwebp -q 80 {} -o {}.webp
Медленно -мес:
printf '%s\n' **/*.@(jpg|jpeg|png|gif)
генерировать список всех возможных кандидатов в виде потока (, так как это printf
встроенный -i, в bash это не ограниченная строка команды -)grep -vf <(printf '%s\n' **/*.webp | sed 's/\.webp$//')
удаляет из этого списка все файлы, с которыми уже связан.webp
(путем перечисления *.webp
файлов, усечения их расширений и использования результата в качестве grep
списка шаблонов)parallel -i cwebp -q 80 {} -o {}.webp
передает результат в параллель для выполнения. Обратите внимание, что, поскольку parallel
, похоже, не имеет параметра для приема ввода, завершающегося нулем -, вам просто нужно надеяться, что у вас нет странных имен файлов.
Метод предварительной -фильтрации также можно использовать для непараллельного -случая.
Я не совсем уверен, что приводит к ошибкам, которые вы показываете, и почему, но предположительно cwebp
возникают проблемы с поиском путей, которые вы ему даете.
Я бы позволил find
найти нужные файлы и выполнить цикл, а не использовать grep
и временный массив:
find. \( -name '*.png' -o -name '*.gif' -o -name '*.jpg' -o -name '*.jpeg' \) \
-type f -exec sh -c '
for pathname do
[ -f "$pathname.webp" ] && continue
cwebp -q 80 "$pathname" -o "$pathname.webp"
done' sh {} +
Здесь я использую find
как своего рода генератор пути для скрипта в -строке sh -c
. Строковый скрипт in -получает пути пакетами и перебирает их в цикле. Для каждого заданного имени пути, если существует соответствующий файл .webp
, цикл переходит к следующему имени пути. В противном случае вызывается команда cwebp
.
Это позволяет избежать проблем со странными именами файлов или каталогов и может быть перенесено на любую систему, в которой cwebp
установлена (сама команда find
является стандартной, как и скрипт в строке -).
См. также " Понимание опции -exec команды `find`" для получения дополнительной информации о синтаксисе -exec sh -c '...' sh {} +
.
Если это по-прежнему не работает, вы можете проверить файлы изображений, о которых сообщается, чтобы убедиться, что они действительно являются допустимыми файлами изображений.