Сценарий запуска одной строки оболочки Linux, если файл не существует, не работает

Как вы упомянули, не рекомендуется отключать запрос пароля, если только система не работает в определенной защищенной среде.

Одним из возможных решений является вот этот -лайнер, который мне легче запомнить, чем вариант NOPASSWD. Получите права администратора и запустите

$ visudo

и добавьте следующую строку

Defaults: username !authenticate

Это полностью отключит запрос пароля для определенного пользователя.

0
19.04.2020, 12:58
2 ответа

Лучшее решение в 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, похоже, не имеет параметра для приема ввода, завершающегося нулем -, вам просто нужно надеяться, что у вас нет странных имен файлов.

Метод предварительной -фильтрации также можно использовать для непараллельного -случая.

2
19.03.2021, 02:27

Я не совсем уверен, что приводит к ошибкам, которые вы показываете, и почему, но предположительно 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 {} +.

Если это по-прежнему не работает, вы можете проверить файлы изображений, о которых сообщается, чтобы убедиться, что они действительно являются допустимыми файлами изображений.

0
19.03.2021, 02:27

Теги

Похожие вопросы