![Executando um script ao inserir uma unidade flash](https://rvso.com/image/977064/Executando%20um%20script%20ao%20inserir%20uma%20unidade%20flash.png)
Como posso escrever um script que seja acionado em um evento?
Quando insiro uma unidade flash USB, o Ubuntu a monta e abre automaticamente o Nautilus. Quando isso acontece com um pen drive específico, gostaria de abrir uma segunda aba com uma determinada pasta.
Não acho que isso possa ser feito com um script Nautilus, mas como posso fazer isso com um script Linux ou uma extensão Nautilus?
Responder1
Se você executar o script abaixo em segundo plano, ele verificará os volumes montados. Se uma de suas unidades definidas estiver montada, ela abrirá automaticamente a pasta definida no nautilus.
Um pequeno problema é que o nautilus não suporta a abertura de um diretórioem uma nova abana linha de comando, apenas em uma nova janela. Isso significa que a janela inicial, que aparece se você inserir um drive USB, deve ser fechada normalmente. O script costuma wmctrl
fazer isso, no mesmo momento em que a pasta escolhida será aberta.
Pode ser necessário instalá-lo primeiro:
sudo apt-get install wmctrl
O roteiro
#!/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)
Como usar
Copie o script em um arquivo vazio
Defina suas unidades e pastas
Na seção head do script, altere a linha:
drivename_folders = [("My Passport", "docs"), ("7827-2F8C", "MyFolder")]
onde cada tupla representa uma unidade (nome) e a pasta dentro da unidade que deve ser aberta. Deixei meus nomes de "teste" como exemplo.
Se você não tiver certeza sobre o nome exato da sua unidade, executelsblk
para ver o nome (sem o caminho anterior para o ponto de montagem)Salve o roteiro
Salve o script como
open_folder.py
e execute-o pelo comando:python3 /path/to/open_folder.py
Se tudo funcionar como esperado, adicione-o aos seus aplicativos de inicialização
Como funciona
- A cada dois segundos, o script executa o
lsblk
comando para verificar todos os volumes montados. - Se encontrar um ou mais nomes de volumes recém-montados, ele verifica se o nome está na lista de volumes que você definiu para serem abertos de uma maneira específica (abrindo um subdiretório)
- O script abre o subdiretório do volume que você definiu e fecha a janela (raiz da unidade) que foi aberta automaticamente ao conectar a unidade.
- Para evitar a abertura repetida das pastas, o volume é então adicionado à lista "concluído", até que o volume seja desmontado.
Outros gerenciadores de arquivos
Testei no pcmanfm
(Lubuntu) e thunar
(Xubuntu) e, como esperado, em ambos os casos funciona bem.
Se você quiser usá-lo no Lubuntu ou no Xubuntu, altere a linha:
open_window = "nautilus "+"'"+item[1]+"'"
para:
open_window = "thunar "+"'"+item[1]+"'"
(for Xubuntu)
ou
open_window = "pcmanfm "+"'"+item[1]+"'"
(for Lubuntu, also disable in pcmanfm's preferences: Media > "Show available options for removable media")
Claro, certifique-se wmctrl
de que esteja instalado
Provavelmente, também funcionará em outros gerenciadores de arquivos.
Versão generalizada do script
A versão do script acima é especificamente para uma situação. Para poder usar o script em uma gama mais ampla de finalidades (para executarqualquercomando quando uma unidade específica é conectada, fazendo backups dela, por exemplo) a versão abaixo pode ser útil.
Neste caso, na seção head do script, as tuplas representam:
drivename_folders = [(<drivename_a>, <command_a>), (<drivename_b>, <command_b>)]
veja a configuração "teste" no script abaixo.
O roteiro
#!/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)
Como usar
Copie o script em um arquivo vazio
Defina suas unidades e comandos
Salve o roteiro
Salve o script como
drive_run.py
e execute-o pelo comando:python3 /path/to/drive_run.py
Se tudo funcionar como esperado, adicione-o aos seus aplicativos de inicialização