Документ создан: 25.03.2011

Добавление в контекстное меню копирование файла с Windows-машин.

Кое-что взято отсюда – NautilusScriptsHowto, и отсюда – Nautilus_Scripts.

Подразумевается, что на Вашей машине уже настроена samba и можно использовать kerberos для обращения к ресурсам. В противном случае, сначала идём сюда – Авторизация в AD с помощью Samba

Так же нужно доставить пакеты:

sudo apt-get install uni2ascii pv

Как только вы добавите какой-либо исполняемый файл в "~/.gnome2/nautilus-scripts/", в контекстном меню, вызываемом щелчком правой кнопкой мыши, появится пункт "Scripts", а в нём – пункт меню названный так же, как и файл, созданный Вами. Если Вам хочется создать вложенное меню, создайте в "~/.gnome2/nautilus-scripts/" каталог, а в каталоге разместите файл.

Я поместил два скрипта в "~/.gnome2/nautilus-scripts/". Работают они одинаково, за тем лишь исключением, что один из них копирует файл в заранее подготовленную структуру каталогов, а второй предлагает выбрать путь размещения.

Вариант 1

smb2local
#!/bin/bash
 
 
LOCATION="/home/username/Work/Oracle/$(basename "$0")"
 
 
for FILENAME in $NAUTILUS_SCRIPT_SELECTED_URIS
do
    FILENAME="$(echo ${FILENAME/smb:} |  ascii2uni -a J)"
    service=$(echo "$FILENAME" | sed -e 's#\(//[^/]*/[^/]*\)/\(.*\)#\1#')
    resource=$(echo "$FILENAME" | sed -e 's#\(//[^/]*/[^/]*\)/\(.*\)#/\2#' | sed -e 's#/#\\\\#g')
    size=$(smbclient -k $service -c "dir \"$resource\"" 2>/dev/null | awk 'NR==1{print $3}')
    newfile="$(basename "$FILENAME")"
 
    (smbclient -k $service -c "get \"$resource\" -" | \
                pv -n -s $size > "$LOCATION/$newfile" | \
                tee > "$LOCATION/$newfile" \
                        && notify-send "Информация." "Копирование $newfile завершено успешно." -t 1500 -i gdu-info \
                        || notify-send "Внимание!" "При копировании $newfile возникли ошибки" -t 1500 -i gdu-warning\
        ) 2>&1 | zenity --progress --text="Копируем $FILENAME\nв $LOCATION/$newfile" --auto-close
done
  • LOCATION - путь, куда будут копироваться файлы. В этом примере приведён такой вариант, в котором в "/home/username/Work/Oracle/" расположены подкаталоги и имя скрипа совпадает с одним из них. Например, есть каталог "/home/username/Work/Oracle/dump", а в "~/.gnome2/nautilus-scripts/" файл – "dump". Это даёт нам возможность создать в "~/.gnome2/nautilus-scripts/" нужное количество файлов одноимённых каталогам. Я делал это через symlink.
  • FILENAME - полное имя файла. В первой строке цикла из него выбрасывается "smb:" (имя изначально выглядит как "smb://host.example.com/resource/path/file.name"), а остальное прогоняется через "ascii2uni", который русские названия из вида "%D0%BF%D0%BE-%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8" переводит в вид "по-русски".
  • service - из полного имени получаем имя ресурса предоставленного в доступ, в нашем случае – "smb://host.example.com/resource"
  • resource - структура каталогов и имя файла, выбранного для копирования. У нас – "/path/file.name". Полученное имя преобразуем в "\\path\\file.name".

Дальше начинается интересное. Чтобы мы могли видеть процент выполнения копирования, мы получаем размер файла (size). Затем, с помощью smbclient начинаем получение файла с сервера, но не в файл, а на стандартное устройство вывода (stdout). С него перенаправляем вывод на вход (stdin) утилиты pv, которая умеет считать проценты и рисовать progress-bar. Результат она выводит на стандартное устройство ошибок (stderr), а то, что получила на stdin просто пробрасывает на stdout. Это всё попадает в sdtin утилиты tee, в зависимости от результата работы которой, будет выведено сообщение об успешном или неуспешном выполнении всей цепочки команд. (Брррр!) А, образно выражаясь, над всей этой кашей, pv пробрасывает stderr на stdin утилиты zenity, которая отображает графический progress-bar в GNOME.
Как-то так…

Вариант 2

smb2local
#!/bin/bash
 
LOCATION=$(zenity --file-selection --directory --title="Select a directory") || exit
 
for FILENAME in $NAUTILUS_SCRIPT_SELECTED_URIS
do
    FILENAME="$(echo ${FILENAME/smb:} |  ascii2uni -a J)"
    service=$(echo "$FILENAME" | sed -e 's#\(//[^/]*/[^/]*\)/\(.*\)#\1#')
    resource=$(echo "$FILENAME" | sed -e 's#\(//[^/]*/[^/]*\)/\(.*\)#/\2#' | sed -e 's#/#\\\\#g')
    size=$(smbclient -k $service -c "dir \"$resource\"" 2>/dev/null | awk 'NR==1{print $3}')
    newfile="$(basename "$FILENAME")"
 
    (smbclient -k $service -c "get \"$resource\" -" | \
                pv -n -s $size > "$LOCATION/$newfile" | \
                tee > "$LOCATION/$newfile" \
                        && notify-send "Информация." "Копирование $newfile завершено успешно." -t 1500 -i gdu-info \
                        || notify-send "Внимание!" "При копировании $newfile возникли ошибки" -t 1500 -i gdu-warning\
        ) 2>&1 | zenity --progress --text="Копируем $FILENAME\nв $LOCATION/$newfile" --auto-close
done

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

 
Recent changes RSS feed Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki Donate