Выполнение сценария при вставке флеш-накопителя

Как я могу записать сценарий, который стреляет в событие?

Когда я вставляю карту флэш-памяти с интерфейсом USB, Ubuntu монтирует его и автоматически открывает Nautilus. Когда это происходит с определенным флеш-накопителем, я хотел бы открыть вторую вкладку с определенной папкой.

Я не думаю, что это может быть сделано со сценарием Наутилуса, но как я могу сделать это со сценарием Linux или расширением Наутилуса?

6
задан 29 November 2014 в 06:41

1 ответ

Если Вы запускаете скрипт ниже в фоновом режиме, он проверяет на смонтированные объемы. Если один из Ваших определенных дисков смонтирован, он автоматически открывает папку набора в наутилусе.

Незначительная проблема состояла в том, что наутилус не поддерживает открытие каталога на новой вкладке из командной строки, только в новом окне. Это означает, что начальное окно, которое появляется при вставке карты памяти должно корректно закрыться. Использование сценария wmctrl сделать это, одновременно что Ваша выбранная папка откроется.

Вы, возможно, должны были бы установить его сначала:

sudo apt-get install wmctrl

Сценарий

#!/usr/bin/env python3

import subprocess
import time

#--
drivename_folders = [("My Passport", "docs"), ("7827-2F8C", "sanel")]
#--

def get_mountedlist():
    return [item[item.find("/"):] for item in subprocess.check_output(
            ["/bin/bash", "-c", "lsblk"]).decode("utf-8").split("\n") if "/" in item]

done = []

while True:
    mounted = get_mountedlist()
    new_paths = [dev for dev in mounted if not dev in done]
    valid = sum([[(drive, drive+"/"+item[1], item[0]) for drive in new_paths \
                  if item[0] in drive] for item in drivename_folders], [])

    for item in valid:
        open_window = "nautilus  "+"'"+item[1]+"'"
        close_window = "wmctrl -c  "+"'"+item[2]+"'"
        subprocess.Popen(["/bin/bash", "-c", open_window])
        time.sleep(1)
        subprocess.Popen(["/bin/bash", "-c", close_window])

    done = mounted
    time.sleep(2)

Как использовать

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

  2. Установите свои диски и папки

    В главном разделе сценария измените строку:

    drivename_folders = [("My Passport", "docs"), ("7827-2F8C", "MyFolder")]
    

    где каждый кортеж представляет диск (имя) и папка в диске, который должен быть открыт. Я оставил свой "тест" - имена как пример.
    Если Вы не уверены в точном названии своего диска, выполненного lsblk видеть имя (без предыдущего пути к точке монтирования)

  3. Сохраните сценарий

    Сохраните сценарий как open_folder.py и выполненный это командой:

    python3 /path/to/open_folder.py
    

Если все работы как Вы ожидали, добавляет это к Вашим Приложениям Запуска

Как это работает

  • Каждые две секунды сценарий работает lsblk управляйте для проверки на все смонтированные объемы.
  • Если это находит, что один или несколько недавно смонтировал имя (имена) тома, это проверяет, находится ли имя в списке громкости, которую Вы регулируете, чтобы быть открытыми в особенном методе (открывающий подкаталог)
  • Сценарий открывает подкаталог объема, который Вы определили и закрываете (корень диска-) окно, которое было автоматически открыто при подключении диска.
  • Для предотвращения неоднократно открытия папок объем затем добавляется к "сделанному" списку, пока объем не размонтирован.

Другие файловые менеджеры

Я протестировал его на pcmanfm (Lubuntu) и thunar (Xubuntu) и, как ожидалось, в обоих случаях, это работает прекрасное.

Если Вы хотите использовать его или на Lubuntu или на Xubuntu, изменить строку:

open_window = "nautilus  "+"'"+item[1]+"'"

кому:

open_window = "thunar "+"'"+item[1]+"'"
(for Xubuntu)

или

open_window = "pcmanfm "+"'"+item[1]+"'"
(for Lubuntu, also disable in pcmanfm's preferences: Media > "Show available options for removable media")

Конечно, удостовериться wmctrl установлен

Скорее всего, это будет работать над другими файловыми менеджерами также.


Обобщенная версия сценария

Версия сценария выше специально для одной ситуации. Чтобы смочь использовать сценарий в более широком диапазоне целей (для выполнения любой команды, когда определенный диск подключается делая резервные копии из него, например), версия ниже могла быть полезной.

В этом случае, в главном разделе сценария, кортежи представляют:

 drivename_folders = [(<drivename_a>, <command_a>), (<drivename_b>, <command_b>)]

посмотрите, что "тест" устанавливает в сценарии ниже.

Сценарий

#!/usr/bin/env python3

import subprocess
import time

#--
drivename_command = [("My Passport", "gnome-terminal"), ("F806-0C50", "gedit")]
#--

def get_mountedlist():
    return [item[item.find("/"):] for item in subprocess.check_output(
            ["/bin/bash", "-c", "lsblk"]).decode("utf-8").split("\n") if "/" in item]

done = []

while True:
    mounted = get_mountedlist()
    newly_mounted = [dev for dev in mounted if not dev in done]
    valid = sum([[(drive, item[1]) for drive in newly_mounted \
                  if item[0] in drive] for item in drivename_command], [])
    for item in valid:
        subprocess.Popen(["/bin/bash", "-c", item[1]])
    done = mounted
    time.sleep(2)

Как использовать

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

  2. Установите свои диски и команды

  3. Сохраните сценарий

    Сохраните сценарий как drive_run.py и выполненный это командой:

    python3 /path/to/drive_run.py
    

Если все работы как Вы ожидали, добавляет это к Вашим Приложениям Запуска

6
ответ дан 23 November 2019 в 07:49

Другие вопросы по тегам:

Похожие вопросы: