Como posso copiar automaticamente o conteúdo de uma unidade usb (flash) para outro diretório?

5

Eu quero programar meu Ubuntu de tal forma que copie automaticamente o conteúdo da unidade flash USB para uma pasta definida no meu diretório pessoal.

Eu gostaria que isso fosse feito automaticamente quando qualquer flash drive está sendo conectado (portanto, não apenas os específicos).

    
por Eng Fares 16.12.2014 / 20:35

1 resposta

6

O script abaixo é uma variante oposta de este script ; enquanto aquele atua em unidades especificadas , esses scripts atuam em todas as unidades exceto especificadas (usb).

O que faz

  • Sempre que um dispositivo de armazenamento USB externo está sendo conectado, o script copia seu conteúdo em um diretório, definido por você (na seção head do script: target_folder = ). Um subdiretório é criado com o nome da unidade da qual foi copiado.
  • Se a pasta de destino (cópia anterior do conteúdo do disco) existir, ela substituirá a cópia anterior.
  • Também adicionei uma entrada excluded = , na qual você pode (e provavelmente deve) listar os nomes de seus dispositivos usb "normais" (permanentes) (unidades "normais" são excluídas automaticamente). parece que o Ubuntu define o tipo de dispositivo principalmente pelo sistema de arquivos; Eu testei a formatação de uma unidade flash como ext4 e ela apareceu como uma unidade "normal" em vez de uma unidade flash.

O script

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

Como usar

Copie o script em um arquivo vazio. Na seção head, defina:

  • o caminho para onde você deseja armazenar as cópias de suas unidades flash inseridas

    target_folder = "/path/to/directory"
    
  • os nomes dos seus dispositivos possivelmente permanentemente conectados (use lsblk se você não souber)

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

    Por exemplo :

    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  
    

    Na saída do meu lsblk , existem dois dispositivos: 19C3-0A41 e media_extern . O último é meu disco permanentemente conectado que desejo excluir:

    excluded = ["media_extern"]
    

Salve o script como copy_flash.py , execute-o por:

python3 /path/to/copy_flash.py

Se ele fizer o que você deseja, adicione-o aos seus aplicativos de inicialização: Dash > Aplicativos de inicialização > Adicionar

    
por Jacob Vlijm 16.12.2014 / 22:53