我想以这样的方式对我的 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)
如何使用
将脚本复制到一个空文件中。在 head 部分,设置:
您要存储插入的闪存驱动器副本的路径
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 > 启动应用程序 > 添加