Как я могу автоматически скопировать содержимое USB-накопителя в другой каталог?
Я хочу запрограммировать Ubuntu таким образом, чтобы он автоматически копировал содержимое флэш-накопителя USB в определенную папку в моем домашнем каталоге.
Я бы хотел, чтобы это делалось автоматически при подключении любой флешки (а не только конкретных).
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
, Последний - это мой постоянно подключенный диск, который я хочу исключить:excluded = ["media_extern"]
Сохранить скрипт как copy_flash.py
запустите его:
python3 /path/to/copy_flash.py
Если он делает то, что вы хотите, добавьте его в свои запускаемые приложения: Dash > Startup Applications > Add