Найти изображения в формате jpg без дополнительного суффикса webp - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть каталог с несколькими миллионами изображений, случайно размещенных в других подкаталогах. Я хочу создать изображения webp для всех изображений jpg, добавив расширение webp, оставив в стороне другие форматы, такие как изображения gif.

Я могу запустить приведенную ниже команду в Ubuntu 18, чтобы сгенерировать все нужные мне изображения webp, состоящие из имени файла с добавленным к нему суффиксом .webp:

find /home/photos -type f \( -iname \*.jpg -o -iname \*.jpeg \) | parallel -eta cwebp {} -o {}.webp

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

Если у меня есть:

-- 1.png
-- 1.gif
-- 2.jpg
-- 2.jpg.webp
-- 3.jpg
-- subdir/4.jpg
-- subdir/5.jpg
-- subdir/5.jpg.webp

Как мне найти, только 3.jpg и subdir/4.jpg? (без веб-версии)

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

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Вы можете проверить наличие выходного файла в parallel и создать его, только если он не существует следующим образом:

find . -iname \*.jpg | parallel -eta 'out={}.webp; [ ! -f "$out" ] && cwebp {} -o "$out"'

Или, точно так же, но стараюсь быть менее негативным в моем мировоззрении:

find . -iname \*.jpg | parallel -eta 'out={}.webp; [ -f "$out" ] || cwebp {} -o "$out"'

: -)

0 голосов
/ 17 ноября 2018

Для просмотра только тех файлов, у которых нет соответствующего .webp файла, вы можете использовать grep следующим образом:

find /home/photos -type f \( -iname \*.jpg -o -iname \*.jpeg \) |
grep -vFxf <(find /home/photos -type f -name \*.webp | sed 's/\.webp$//')

Проверьте вывод, затем добавьте | parallel ...

С помощью <(...) мы создаем анонимный файл, который содержит все .jpg файлы, которые уже имеют соответствующий .webp файл. grep отфильтровывает все эти строки из стандартного ввода.

Этот подход не будет работать для путей с разрывами в них. Но поскольку вы не использовали -print0, это не проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...