web-dev-qa-db-fra.com

Comment puis-je copier automatiquement le contenu d'un lecteur USB (flash) dans un autre répertoire?

Je souhaite programmer mon Ubuntu de telle sorte qu'il copie automatiquement le contenu du lecteur flash USB dans un dossier défini de mon répertoire personnel.

Je voudrais que ceci soit fait automatiquement quand n'importe lequel le lecteur flash est connecté (donc pas seulement ceux spécifiques).

5
Eng Fares

Le script ci-dessous est une variante opposée de ce script ; alors que celui-ci agit sur des lecteurs spécifiés , ce script agit sur tous à l'exception de lecteurs spécifiés (usb).

Ce qu'il fait

  • Chaque fois qu'un périphérique de stockage USB externe est connecté, le script copie son contenu dans un répertoire que vous avez défini (dans la section d'en-tête du script: target_folder =). Un sous-répertoire est créé avec le nom du lecteur à partir duquel il a été copié.
  • Si le dossier cible (copie antérieure du contenu du disque) existe, il écrase la copie précédente.
  • J'ai également ajouté une entrée excluded =, dans laquelle vous pouvez (et devriez probablement) répertorier les noms de vos périphériques usb "normaux" (permanents) (les lecteurs "normaux" sont déjà exclus automatiquement). il semble qu'Ubuntu définisse le type de périphérique principalement par le système de fichiers; J'ai testé le formatage d'un lecteur flash en tant que ext4 et il s'est révélé être un lecteur "normal" au lieu d'un lecteur flash.

Le scénario

#!/usr/bin/env python3

import subprocess
import time
import shutil

#--
target_folder = "/path/to/target_folder"
excluded = ["media_extern"]
#--

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

def identify(disk):
    command = "find /dev/disk -ls | grep /"+disk
    output = subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")
    if "usb" in output:
        return True
    else:
        return False

done = []
while True:
    mounted = get_mountedlist()
    new_paths = [dev for dev in get_mountedlist() if not dev in done and not dev[1] == "/"]
    valid = [dev for dev in new_paths if (identify(dev[0]), dev[1].split("/")[-1]  in excluded) == (True, False)]
    for item in valid:
        target = target_folder+"/"+item[1].split("/")[-1]
        try:
            shutil.rmtree(target)
        except FileNotFoundError:
            pass
        shutil.copytree(item[1], target)
    done = mounted
    time.sleep(4)

Comment utiliser

Copiez le script dans un fichier vide. Dans la section head, définissez:

  • le chemin d'accès à l'emplacement où vous souhaitez stocker les copies de vos lecteurs flash insérés

    target_folder = "/path/to/directory"
    
  • les noms de vos appareils éventuellement connectés en permanence (utilisez lsblk si vous ne le savez pas)

    excluded = ["media_extern", "<some_other_drive>"]
    

    Par exemple :

    sdb      8:16   1   471M  0 disk 
    └─sdb1   8:17   1   471M  0 part /media/jacob/19C3-0A41
    sdc      8:32   0 698,6G  0 disk 
    └─sdc1   8:33   0 698,6G  0 part /media/jacob/media_extern
    sr0     11:0    1  1024M  0 rom  
    

    Dans la sortie de mon lsblk, il y a deux périphériques: 19C3-0A41 et media_extern. Le dernier est mon disque connecté en permanence que je veux exclure:

    excluded = ["media_extern"]
    

Enregistrez le script sous copy_flash.py, exécutez-le comme suit:

python3 /path/to/copy_flash.py

Si cela vous convient, ajoutez-le à vos applications de démarrage: Dash> Applications de démarrage> Ajouter

6
Jacob Vlijm