GNU/Linux >> Znalost Linux >  >> Ubuntu

Jak automaticky zkopírovat obsah USB (flash) disku do jiného adresáře?

Chci své Ubuntu naprogramovat tak, aby automaticky zkopírovalo obsah USB flash disku do definované složky v mém domovském adresáři.

Chci, aby se to provedlo automaticky, když jakékoli flash disk se připojuje (tedy nejen konkrétní).

Přijatá odpověď:

Níže uvedený skript je opačnou variantou tohoto skriptu; zatímco ten působí na určené disky, tyto skripty fungují na všech kromě zadané (usb) disky.

Co to dělá

  • Kdykoli se připojuje externí úložné zařízení USB, skript zkopíruje jeho obsah do vámi definovaného adresáře (v hlavičce skriptu:target_folder = ). Vytvoří se podadresář s názvem jednotky, ze které byl zkopírován.
  • Pokud cílová složka (dřívější kopie obsahu disku) existuje, přepíše dřívější kopii.
  • Přidal jsem také položku excluded = , ve kterém můžete (a pravděpodobně byste měli) uvést názvy svých „normálních“, (trvalých) zařízení USB („normální“ disky jsou již automaticky vyloučeny). zdá se, že Ubuntu definuje typ zařízení hlavně systémem souborů; Testoval jsem formátování flash disku jako ext4 a objevil se jako „normální“ disk namísto flash disku.

Skript

#!/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)

Jak používat

Zkopírujte skript do prázdného souboru. V sekci hlavy nastavte:

  • cestu k místu, kam chcete uložit kopie vložených flash disků

    target_folder = "/path/to/directory"
    
  • názvy vašich případně trvale připojených zařízení (použijte lsblk pokud nevíte)

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

    Například :

    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  
    

    Ve výstupu mého lsblk , existují dvě zařízení:19C3-0A41 a media_extern . Poslední je můj trvale připojený disk, který chci vyloučit:

    excluded = ["media_extern"]
    

Uložte skript jako copy_flash.py , spusťte jej:

python3 /path/to/copy_flash.py

Pokud dělá to, co chcete, přidejte jej do spouštěcích aplikací:Dash> Startup Applications> Add

Související:Jak odebrat applet indikátoru ikony pošty v Ubuntu?
Ubuntu
  1. Jak spustit program C++ vždy, když je vložen USB flash disk?

  2. Jak zkopírovat výstup terminálu?

  3. Jak automaticky spustit skript, když se v Linuxu změní obsah adresáře?

  1. Jak zkopírovat cestu k aktuálnímu adresáři v Ubuntu 18.04?

  2. Proč nemohu zkopírovat velké množství souborů na USB flash disk?

  3. Jak připojit USB flash disk v Linuxu

  1. Jak šifrovat USB disk na Ubuntu 18.04 LTS

  2. Jak zkopírovat 10 posledních souborů z jednoho adresáře do druhého?

  3. Jak vytvořit bootovací Memtest86+ na USB flash disku?