Voglio programmare il mio Ubuntu in modo tale che copi automaticamente il contenuto dell'unità flash USB in una cartella definita nella mia home directory.
Vorrei che ciò avvenisse automaticamente quando qualsiasi unità flash in corso di connessione (quindi non solo quelle specifiche).
Risposta accettata:
Lo script seguente è una variante opposta di questo script; mentre quello agisce su specificato unità, questo script agisce su tutti tranne unità (USB) specificate.
Cosa fa
- Ogni volta che viene collegato un dispositivo di archiviazione USB esterno, lo script ne copia il contenuto in una directory, definita da te (nella sezione head dello script:
target_folder =
). Viene creata una sottodirectory con il nome dell'unità da cui è stata copiata. - Se la cartella di destinazione (copia precedente del contenuto del disco) esiste, sovrascrive la copia precedente.
- Ho anche aggiunto una voce
excluded =
, in cui puoi (e probabilmente dovresti) elencare i nomi dei tuoi dispositivi usb "normali", (permanenti) (le unità "normali" sono escluse già automaticamente). sembra che Ubuntu definisca il tipo di dispositivo principalmente dal file system; Ho provato a formattare un'unità flash comeext4
, e si presentava come un'unità "normale" anziché come un'unità flash.
Il copione
#!/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)
Come si usa
Copia lo script in un file vuoto. Nella sezione testa, imposta:
-
il percorso in cui desideri archiviare le copie delle unità flash inserite
target_folder = "/path/to/directory"
-
i nomi dei tuoi dispositivi eventualmente collegati in modo permanente (usa
lsblk
se non lo sai)excluded = ["media_extern", "<some_other_drive>"]
Ad esempio :
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
Nell'output del mio
lsblk
, ci sono due dispositivi:19C3-0A41
emedia_extern
. L'ultimo è il mio disco connesso in modo permanente che voglio escludere:excluded = ["media_extern"]
Salva lo script come copy_flash.py
, eseguilo da:
python3 /path/to/copy_flash.py
Se fa quello che vuoi, aggiungilo alle tue applicazioni di avvio:Dash> Applicazioni di avvio> Aggiungi
Correlati:come rimuovere l'applet dell'indicatore dell'icona di posta in Ubuntu?