Comment puis-je écrire un script qui déclenche un événement?
Lorsque j'insère un lecteur flash USB, Ubuntu le monte et ouvre automatiquement Nautilus. Lorsque cela se produit avec un lecteur flash spécifique, j'aimerais ouvrir un deuxième onglet avec un dossier déterminé.
Je ne pense pas que cela puisse être fait avec un script Nautilus, mais comment puis-je le faire avec un script Linux ou une extension Nautilus?
Si vous exécutez le script ci-dessous en arrière-plan, il recherche les volumes montés. Si l’un des disques que vous avez définis est monté, il ouvre automatiquement le dossier défini dans Nautilus.
Un problème mineur était que nautilus ne supportait pas l'ouverture d'un répertoire dans un nouvel onglet à partir de la ligne de commande, uniquement dans une nouvelle fenêtre. Cela signifie que la fenêtre initiale, qui apparaît si vous insérez un lecteur USB, doit être fermée avec élégance. Le script utilise wmctrl
pour le faire, au même moment où le dossier choisi sera ouvert.
Vous devrez peut-être d'abord l'installer:
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)
Copiez le script dans un fichier vide
Définissez vos lecteurs et dossiers
Dans la section head du script, modifiez la ligne:
drivename_folders = [("My Passport", "docs"), ("7827-2F8C", "MyFolder")]
où chaque Tuple représente un lecteur (nom) et le dossier à l'intérieur du lecteur à ouvrir. J'ai laissé mes noms "test" à titre d'exemple.
Si vous n'êtes pas sûr du nom exact de votre lecteur, exécutez lsblk
pour voir le nom (sans le chemin précédent du point de montage).
Sauvegarder le script
Enregistrez le script sous open_folder.py
et exécutez-le à l'aide de la commande suivante:
python3 /path/to/open_folder.py
Si tout fonctionne comme prévu, ajoutez-le à vos applications de démarrage.
lsblk
pour rechercher tous les volumes montés.Je l'ai testé sur pcmanfm
(Lubuntu) et thunar
(Xubuntu) et, comme prévu, dans les deux cas, tout se passe bien.
Si vous souhaitez l’utiliser sur Lubuntu ou Xubuntu, modifiez la ligne:
open_window = "nautilus "+"'"+item[1]+"'"
à:
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")
Bien sûr, assurez-vous que wmctrl
est installé
Très probablement, cela fonctionnera également sur d'autres gestionnaires de fichiers.
La version du script ci-dessus est spécifiquement destinée à une situation. Pour pouvoir utiliser le script dans un plus grand nombre de buts (exécuter la commande toute quand un lecteur spécifique est connecté, en effectuant des sauvegardes par exemple), la version ci-dessous pourrait être utile.
Dans ce cas, dans la section head du script, les n-uplets représentent:
drivename_folders = [(<drivename_a>, <command_a>), (<drivename_b>, <command_b>)]
voir le réglage "test" dans le script ci-dessous.
#!/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)
Copiez le script dans un fichier vide
Définissez vos lecteurs et commandes
Sauvegarder le script
Enregistrez le script sous drive_run.py
et exécutez-le à l'aide de la commande suivante:
python3 /path/to/drive_run.py
Si tout fonctionne comme prévu, ajoutez-le à vos applications de démarrage.