![Ejecutar un script al insertar una unidad flash](https://rvso.com/image/977064/Ejecutar%20un%20script%20al%20insertar%20una%20unidad%20flash.png)
¿Cómo puedo escribir un script que se active en un evento?
Cuando inserto una unidad flash USB, Ubuntu la monta y abre Nautilus automáticamente. Cuando esto sucede con una unidad flash específica, me gustaría abrir una segunda pestaña con una carpeta determinada.
No creo que se pueda hacer con un script de Nautilus, pero ¿cómo puedo hacerlo con un script de Linux o una extensión de Nautilus?
Respuesta1
Si ejecuta el siguiente script en segundo plano, comprobará los volúmenes montados. Si una de sus unidades definidas está montada, abre automáticamente la carpeta configurada en nautilus.
Un problema menor fue que nautilus no admite la apertura de un directorio.en una nueva pestañadesde la línea de comando, solo en una nueva ventana. Eso significa que la ventana inicial, que aparece si insertas una unidad USB, debe cerrarse correctamente. El script utiliza wmctrl
para hacer eso, en el mismo momento en que se abrirá la carpeta elegida.
Es posible que tengas que instalarlo primero:
sudo apt-get install wmctrl
La secuencia de comandos
#!/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)
Cómo utilizar
Copie el script en un archivo vacío
Configure sus unidades y carpetas
En la sección principal del script, cambie la línea:
drivename_folders = [("My Passport", "docs"), ("7827-2F8C", "MyFolder")]
donde cada tupla representa una unidad (nombre) y la carpeta dentro de la unidad que debe abrirse. Dejé mis nombres de "prueba" como ejemplo.
Si no está seguro del nombre exacto de su unidad, ejecutelsblk
para ver el nombre (sin la ruta anterior al punto de montaje)guardar el guión
Guarde el script como
open_folder.py
y ejecútelo con el comando:python3 /path/to/open_folder.py
Si todo funciona como esperaba, agréguelo a sus Aplicaciones de inicio
Cómo funciona
- Cada dos segundos, el script ejecuta el
lsblk
comando para comprobar todos los volúmenes montados. - Si encuentra uno o más nombres de volúmenes recién montados, verifica si el nombre está en la lista de volúmenes que configuró para abrirse de una manera específica (abriendo un subdirectorio).
- El script abre el subdirectorio del volumen que definió y cierra la ventana (raíz de la unidad) que se abrió automáticamente al conectar la unidad.
- Para evitar abrir las carpetas repetidamente, el volumen se agrega a la lista "listo", hasta que se desmonta el volumen.
Otros administradores de archivos
Lo probé en pcmanfm
(Lubuntu) y thunar
(Xubuntu) y, como era de esperar, en ambos casos funciona bien.
Si desea usarlo en Lubuntu o Xubuntu, cambie la línea:
open_window = "nautilus "+"'"+item[1]+"'"
a:
open_window = "thunar "+"'"+item[1]+"'"
(for Xubuntu)
o
open_window = "pcmanfm "+"'"+item[1]+"'"
(for Lubuntu, also disable in pcmanfm's preferences: Media > "Show available options for removable media")
Por supuesto, asegúrese de wmctrl
que esté instalado.
Lo más probable es que también funcione en otros administradores de archivos.
Versión generalizada del guión.
La versión del script anterior es específicamente para una situación. Para poder utilizar el script en una gama más amplia de propósitos (para ejecutarcualquiercomando cuando se conecta una unidad específica, haciendo copias de seguridad de ella, por ejemplo) la siguiente versión podría ser útil.
En este caso, en la sección principal del script, las tuplas representan:
drivename_folders = [(<drivename_a>, <command_a>), (<drivename_b>, <command_b>)]
consulte la configuración de "prueba" en el siguiente script.
La secuencia de comandos
#!/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)
Cómo utilizar
Copie el script en un archivo vacío
Configure sus unidades y comandos
guardar el guión
Guarde el script como
drive_run.py
y ejecútelo con el comando:python3 /path/to/drive_run.py
Si todo funciona como esperaba, agréguelo a sus Aplicaciones de inicio