Как я могу автоматически скопировать содержание usb (флэш-память) диск к другому каталогу?

Я хочу программировать свою Ubuntu таким способом, которым она автоматически копирует содержание карты флэш-памяти с интерфейсом USB к определенной папке в моем корневом каталоге.

Я хотел бы, чтобы это было сделано автоматически, когда любой флеш-накопитель подключается (так не только определенные).

5
задан 17 December 2014 в 04:34

1 ответ

Сценарий ниже является противоположным - вариант этого сценария; в то время как тот действует на указанные диски, это пишет сценарий действий на всех кроме указанного (usb) диски.

Что это делает

  • Каждый раз, когда внешнее устройство хранения USB подключается, сценарий копирует свое содержание в каталог, определенный Вами (в главном разделе сценария: target_folder =). Подкаталог создается с названием диска, с которого это было скопировано.
  • Если целевая папка (более ранняя копия содержания диска) существует, это перезаписывает более раннюю копию.
  • Я также добавил запись excluded =, в котором Вы можете (и вероятно должен) перечислять названия Ваших "нормальных", (постоянных) USB-устройств ("нормальные" диски исключены уже автоматически). кажется, что Ubuntu определяет тип устройства главным образом файловой системой; я протестировал форматирование флеш-накопителя как ext4, и это обнаружилось как "нормальный" диск вместо флеш-накопителя.

Сценарий

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

Как использовать

Скопируйте сценарий в пустой файл. В главном разделе, наборе:

  • путь туда, где Вы хотите сохранить копии своих вставленных флеш-накопителей

    target_folder = "/path/to/directory"
    
  • названия Ваших возможно постоянно подключенных устройств (использование lsblk если Вы не знаете),

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

    Например:

    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  
    

    В выводе моего lsblk, существует два устройства: 19C3-0A41 и media_extern. Последний является моим постоянно связанным диском I, хотите исключить:

    excluded = ["media_extern"]
    

Сохраните сценарий как copy_flash.py, выполните его:

python3 /path/to/copy_flash.py

Если это делает то, что Вы хотите, добавьте его к своим приложениям запуска: Тире> Приложения Запуска> Добавляет

6
ответ дан 23 November 2019 в 09:13

Другие вопросы по тегам:

Похожие вопросы: