понедельник, 29 ноября 2010 г.

Nautilus scripts: действия с выделенными файлами

У жены на ноуте стоит Убунта. Как-то раз спрашивает она меня: как уменьшить картинки, чтоб отправить по почте?
Показал ей как это делается в gThumb. Чуть позже слышу — вздыхает. Смотрю — у неё открыта папка с кучей картинок, а она сидит и ресайзит их, одну за другой: открывает, Image -> Resize, width = 1024, Scale, File -> Save As…

СТОП!

Мой первый рефлекс, естественно, Ctlr-Alt-T, cd куда надо, for f in *.jpg; do convert $f -resize 1024… Жена, однако, с шеллом не знакома и желанием осваивать не горит.

Было бы круто прикрутить пункт в контекстное меню, чтоб он выделенные файлы ресайзил. Но как?


Есть, оказывается такая штука — nautilus-scripts, предназначенная именно для этого.

Суть такова: имена всех исполняемых файлов из ~/.gnome2/nautilus-scripts/ выводятся в подменю Scripts контекстного меню Наутилуса. Выбранный скрипт получает список выделенных файлов в переменной NAUTILUS_SCRIPT_SELECTED_FILE_PATHS и может делать с ним что хочет, например ресайзить.

Важная особенность: имена файлов в переменной разделены переводами строки.

Итак, открываем $EDITOR и пишем в ~жена/.gnome2/nautilus-scripts/Resize-1024:

#!/bin/bash
IFS=$'\n'  # Разбивать только по переводам строки
for name in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS; do
  new_name=`echo "$name" | sed 's/\(.*\)\(\....\)/\1-1024\2/'`  # abc.jpg => abc-1024.jpg
  [ "$new_name" != "$name" ] && convert "$name" -resize 1024 "$new_name"
done


Гордо представляю на суд жены и получаю первый feature request: дело в том, что работать-то оно работает, но без каких либо внешних проявлений. Как понять, когда всё сделано? Предложение смотреть на CPU usage понимания не находит :)

Долго вспоминаем «как же эта хрень называется»… «Эта хрень» называется Zenity и позволяет выводить из консоли простые диалоговые окна (OK, OK/Cancel), а также progress bar:

(echo "# Делаем раз"; sleep 1; echo "50"; echo "# Делаем два"; sleep 1; echo "50") | zenity --progress

В результате, версия 2.0 выглядит так:

#!/bin/bash

NEW_RES=1024

IFS=$'\n'
n=0
for _ in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS; do n=$(($n + 1)); done
i=0
for name in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS; do
  i=$(($i + 1))
  if [ -f "$name" ]; then
    bn=`basename "$name"`
    echo "# $bn"
    new_name=`echo "$name" | sed 's/\(.*\)\(\....\)/\1-'$NEW_RES'\2/'`
    [ "$new_name" != "$name" ] && convert "$name" -resize $NEW_RES "$new_name"
  fi
  echo $(($i * 100 / $n))
done | zenity --progress --auto-close --auto-kill
unset IFS



Источник: Хабрахабр - Linux для всех
Оригинальная страница: Nautilus scripts: действия с выделенными файлами

Комментариев нет:

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