Минифицировать CSS с помощью сценария Nautilus в Linux

Выделил style.css — получил минифицированный style.min.css рядом. Для каждого .css просто запускаю сценарий и всё готово. Так минифицирую стили для продакшена: cleancss ужимает файл, страницы грузятся быстрее.

Куда положить

Можно просто скачать скрипт Nautilus ниже и положить по этому пути. Скрипты Nautilus живут здесь:

bash
~/.local/share/nautilus/scripts/

Этот файл — ~/.local/share/nautilus/scripts/Минифицировать CSS. В свойствах включаю «Исполняемый как приложение» — без этого пункта в меню не будет.

Или через командную строку

  1. Ставлю зависимости

    Скрипт проверяет команду cleancss и пользуется zenity для ошибок и отчёта.

    bash
    sudo apt install -y zenity cleancss
  2. Создаю файл

    Имя файла — то, что будет в меню: Минифицировать CSS.

    bash
    mkdir -p ~/.local/share/nautilus/scripts
    touch ~/.local/share/nautilus/scripts/"Минифицировать CSS"
  3. Даю права на исполнение

    Без прав на исполнение Nautilus скрипт не покажет.

    bash
    chmod +x ~/.local/share/nautilus/scripts/"Минифицировать CSS"
  4. Открываю в редакторе

    xdg-open поднимает графический редактор, не nano.

    bash
    xdg-open ~/.local/share/nautilus/scripts/"Минифицировать CSS"
  5. Вставляю код и пользуюсь

    Вставляю код ниже и пользуюсь: выделил файлы → ПКМ → «Сценарии». Чтобы меню подхватило файл:

    bash
    nautilus -q

Код

bash
#!/bin/bash

readonly SCRIPT_TITLE="Минифицировать CSS"

declare -i converted=0 skipped=0 failed=0
report_lines=()

require_cleancss() {
    if command -v cleancss >/dev/null 2>&1; then
        return 0
    fi

    zenity --error --no-wrap 
        --title="$SCRIPT_TITLE" 
        --text="Нужен cleancss.nnУстановите:nsudo apt install cleancss"
    exit 1
}

gather_selection() {
    local -n _out=$1

    if [ -n "${NAUTILUS_SCRIPT_SELECTED_FILE_PATHS:-}" ]; then
        IFS=$'n' read -d '' -r -a _out < <(printf '%sn' "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS")
        return
    fi

    if [ "$#" -gt 0 ]; then
        _out=("$@")
        return
    fi

    zenity --error --no-wrap --title="$SCRIPT_TITLE" --text="Сначала выделите CSS-файлы."
    exit 1
}

is_css_file() {
    local path="$1"
    local ext="${path##*.}"
    local ext_lower="${ext,,}"

    [ "$ext_lower" = "css" ]
}

minify_css_file() {
    local input="$1"
    local output="$2"

    cleancss -o "$output" "$input"
}

process_file() {
    local file="$1"
    local base output

    if [ ! -f "$file" ]; then
        skipped=$((skipped + 1))
        report_lines+=("⊘ не найден: $(basename "$file")")
        return
    fi

    if ! is_css_file "$file"; then
        skipped=$((skipped + 1))
        report_lines+=("⊘ не CSS: $(basename "$file")")
        return
    fi

    base="${file%.*}"
    output="${base}.min.css"

    if minify_css_file "$file" "$output"; then
        if [ -f "$output" ]; then
            converted=$((converted + 1))
            report_lines+=("✓ $(basename "$output")")
        else
            failed=$((failed + 1))
            report_lines+=("✗ не создан: $(basename "$output")")
        fi
    else
        failed=$((failed + 1))
        report_lines+=("✗ ошибка: $(basename "$file")")
        rm -f -- "$output"
    fi
}

build_final_message() {
    local message=""

    message="Готово: ${converted} из $((${converted} + ${skipped} + ${failed}))"
    message+="nПропущено: ${skipped}"

    if [ "${failed}" -gt 0 ]; then
        message+="nС ошибкой: ${failed}"
    fi

    if [ "${#report_lines[@]}" -gt 0 ]; then
        message+="nn$(printf '%sn' "${report_lines[@]}")"
    fi

    printf '%s' "$message"
}

notify_result() {
    local message="$1"

    if [ "${failed}" -gt 0 ]; then
        zenity --error --no-wrap --title="$SCRIPT_TITLE" --text="$message"
        return
    fi

    if [ "${converted}" -eq 0 ]; then
        zenity --warning --no-wrap --title="$SCRIPT_TITLE" --text="$message"
        return
    fi

    zenity --info --no-wrap --title="$SCRIPT_TITLE" --text="$message"
}

selected=()
gather_selection selected "$@"

require_cleancss

if [ ${#selected[@]} -eq 0 ]; then
    zenity --error --no-wrap --title="$SCRIPT_TITLE" --text="Список файлов пуст."
    exit 1
fi

for file in "${selected[@]}"; do
    process_file "$file"
done

notify_result "$(build_final_message)"
← К списку статей

Поделиться

Комментарии

Пока нет комментариев — можете написать первый.

Оставить комментарий

Войти с помощью

или оставьте комментарий как гость

Отправка защищена сервисом Yandex SmartCaptcha. Подробности — в политике конфиденциальности.