![Выполнение скрипта при вставке флешки](https://rvso.com/image/977064/%D0%92%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%20%D0%BF%D1%80%D0%B8%20%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B5%20%D1%84%D0%BB%D0%B5%D1%88%D0%BA%D0%B8.png)
Как написать скрипт, срабатывающий при наступлении события?
Когда я вставляю USB-флешку, Ubuntu монтирует ее и автоматически открывает Nautilus. Когда это происходит с определенной флешкой, я хотел бы открыть вторую вкладку с определенной папкой.
Я не думаю, что это можно сделать с помощью скрипта Nautilus, но как это сделать с помощью скрипта Linux или расширения Nautilus?
решение1
Если вы запустите скрипт ниже в фоновом режиме, он проверит смонтированные тома. Если один из ваших определенных дисков смонтирован, он автоматически откроет заданную папку в nautilus.
Небольшая проблема заключалась в том, что Nautilus не поддерживал открытие каталога.в новой вкладкеиз командной строки, только в новом окне. Это означает, что начальное окно, которое появляется, если вы вставляете usb-накопитель, должно быть изящно закрыто. Скрипт использует 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)
Как использовать
Скопируйте скрипт в пустой файл.
Настройте диски и папки
В заголовке скрипта измените строку:
drivename_folders = [("My Passport", "docs"), ("7827-2F8C", "MyFolder")]
где каждый кортеж представляет диск(имя) и папку внутри диска, которую нужно открыть. Я оставил свои "test" -names в качестве примера.
Если вы не уверены в точном имени вашего диска, запустите,lsblk
чтобы увидеть имя (без предшествующего пути к точке монтирования)Сохранить сценарий
Сохраните скрипт как
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>)]
см. настройку «test» в скрипте ниже.
Сценарий
#!/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)
Как использовать
Скопируйте скрипт в пустой файл.
Установите свои приводы и команды
Сохранить сценарий
Сохраните скрипт как
drive_run.py
и запустите его командой:python3 /path/to/drive_run.py
Если все работает так, как вы ожидали, добавьте его в список автозапускаемых приложений.