Скриншоты на долгое хранение

Есть у меня один пунктик — обожаю оставлять цифровые следы. Возвращаться к старым наработкам — для меня как для Кащея копить злато: и смешно, и полезно. Ахаха!

В Ubuntu 24.04 скриншоты делаются на раз-два (PrtSc или PrtSc+ALT), но вот названия…
Снимок экрана от ГГГГ-ММ-ДД ЧЧ-ММ-СС.png” — серьёзно?

Мне нужно:

  • Проще (дата в формате ГГГГ-ММ-ДД@ЧЧ-ММ-СС)
  • Моднее (.webp вместо .png или .jpg)
  • Следяще (автоматика на всё про всё!)

Что сделал:

  • Настроил слежку за папкой ~/Изображения/Снимки экрана (как самый ревнивый муж)
  • Написал скрипт преобразователь screenshot_converter.sh (ниже будет код — не переключайтесь!)
  • Заставил это дело работать как сервис (чтобы жило своей жизнью)

Теперь ниже по шагам.

Установка зависимостей

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

Устанавливаем необходимый инструмент:

# Устанавливаем зависимости (если нужно)
sudo apt install -y inotify-tools webp

Теперь система готова уведомлять о событиях в папке.

Скрипт конвертации файлов скриншотов

#!/bin/bash
#################################################
# Конфигурация
WATCH_DIR="$HOME/Изображения/Снимки экрана"
LOG_FILE="$WATCH_DIR/screenshot-converter.log"
TEMP_DIR="/tmp/screenshot_processor"
mkdir -p "$TEMP_DIR"

# Функция логирования
log() {
    local timestamp=$(date +"%Y-%m-%d %H:%M:%S")
    echo "[$timestamp] $1" >> "$LOG_FILE"
}

# Проверка зависимостей
check_dependencies() {
    if ! command -v inotifywait &> /dev/null; then
        log "ОШИБКА: inotify-tools не установлен. Выполните: sudo apt install -y inotify-tools"
        exit 1
    fi
    if ! command -v cwebp &> /dev/null; then
        log "ОШИБКА: webp не установлен. Выполните: sudo apt install -y webp"
        exit 1
    fi
}

# Функция обработки файла
process_file() {
    local input_file="$1"
    local file_ext=$(echo "${input_file##*.}" | tr '[:upper:]' '[:lower:]')
    
    # Проверяем поддерживаемые форматы
    if [[ "$file_ext" != "jpg" && "$file_ext" != "jpeg" && "$file_ext" != "png" ]]; then
        ##log "ПРОПУЩЕНО: Неподдерживаемый формат файла $input_file"
        return
    fi
    
    # Получаем метаданные файла
    local file_date=$(stat -c %y "$input_file" | cut -d' ' -f1)
    local file_time=$(stat -c %y "$input_file" | cut -d' ' -f2 | cut -d'.' -f1 | tr ':' '-')
    local new_name="${file_date}@${file_time}.webp"
    local output_file="$WATCH_DIR/$new_name"
    
    log "ОБРАБОТКА: Начало конвертации $input_file -> $new_name"
    
    # Конвертируем в WebP
    if [[ "$file_ext" == "png" ]]; then
        cwebp -quiet -lossless "$input_file" -o "$output_file" 2>> "$LOG_FILE"
    else
        cwebp -quiet -q 80 "$input_file" -o "$output_file" 2>> "$LOG_FILE"
    fi
    
    if [ $? -eq 0 ]; then
        log "УСПЕХ: Файл $input_file успешно конвертирован в $output_file"
        rm "$input_file"
    else
        log "ОШИБКА: Не удалось конвертировать $input_file"
        mv "$input_file" "$TEMP_DIR/"
        log "ПЕРЕМЕЩЕНИЕ: Проблемный файл перемещен в $TEMP_DIR/"
    fi
}

# Инициализация
log "ЗАПУСК: Сервис screenshot-converter запущен"
log "КОНФИГУРАЦИЯ: Мониторинг каталога $WATCH_DIR"
log "КОНФИГУРАЦИЯ: Логирование в $LOG_FILE"
check_dependencies

# Основной цикл обработки
inotifywait -m -q -e create -e moved_to --format '%w%f' "$WATCH_DIR" | while read -r file
do
    sleep 2  # Даем время на завершение записи файла
    process_file "$file"
done

Когда создадите файл скрипта, сделайте его исполняемым:

chmod +x screenshot_converter.sh

Запустите его для проверки:

./screenshot_converter.sh

Создание сервиса

Для автоматического запуска при загрузке системы создайте сервисный файл:

sudo nano /etc/systemd/system/screenshot-converter.service

Вставьте содержимое в файл screenshot-converter.service,
но замените в нём путь, где расположен скрипт ExecStart=/home/morikoff/apps/bash/screenshot-converter/, и замените переменную User=morikoff, на что-то своё:

[Unit]
Description=Screenshot to WebP Converter
After=network.target

[Service]
ExecStart=/home/morikoff/apps/bash/screenshot-converter/screenshot_converter.sh
Restart=always
User=morikoff

[Install]
WantedBy=multi-user.target

Запуск сервис

Включите и запустите сервис:

sudo systemctl enable screenshot-converter.service
sudo systemctl start screenshot-converter.service

Проверьте как работает ваш сервис, выполни sudo systemctl status screenshot-converter.service и см. ниже как это выглядит:

Резюме

Мы реализовали автоматизированную систему обработки скриншотов в Ubuntu 24.04, которая:

  • Создаёт файлы с логичным именем в формате ГГГГ-ММ-ДД@ЧЧ-ММ-СС.webp
  • Весь процесс логируется в screenshot-converter.log
  • Работает как фоновый сервис

О перспективе

Потенциальные улучшения системы:

  • Автоматическая организация скриншотов
  • Модифицировать screenshot_converter.sh для сортировки по папкам года
    Пример структуры:
    ~/Изображения/Снимки экрана/2026/
    ~/Изображения/Снимки экрана/2025/
  • Одновременно с сортировкой добавить конвертацию в AVIF через:
    convert input.png -quality 85 output.avif

Обработка скринкастов:

  • Аналогичный механизм для видео в ~/Видео/Записи экрана/
  • Перекодирование MP4 → AV1 (libaom-av1) командой:
    ffmpeg -i input.mp4 -c:v libaom-av1 -crf 30 -cpu-used 4 output.mkv
  • Оптимизация:
    • Снижение битрейта на 50-60% без видимой потери качества
    • Автоматическое определение разрешения источника

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