#! /bin/python3 import os import shutil from glob import glob from tempfile import TemporaryDirectory import subprocess as spdef cp_with_level(list_src, folder_target, folder_src_parent):"""带原目录结构拷贝:param list_src: 带拷贝文件相对路径,支持通配符:param folder_target: 拷贝到的目标路径:param folder_src_parent: 原文件所处路径:return:"""# 拷贝目标文件for fn_need in list_src:parent_folder = os.path.join(folder_target, os.path.split(fn_need)[0])to_find = os.path.join(folder_src_parent, fn_need)print(f'searching: {to_find}')for fn in glob(to_find):pure_fn = os.path.basename(fn)os.makedirs(parent_folder, exist_ok=True)print(f'cp: {fn} -> {parent_folder}')shutil.copy(fn, parent_folder)# 修改权限为可写 os.chmod(os.path.join(parent_folder, pure_fn), 0o600)def extract_from_iso(fn_iso, fns_to_extract, folder_store):"""从iso文件中提取内容:param fn_iso: iso文件路径:param fns_to_extract: 待提取文件相对路径列表,支持shell通配符匹配。示例:['path1/a999.txt', 'path1/b*.txt']:param folder_store: 提取的文件保存目录:return:"""if os.name == 'nt': # windows# 挂载iso并返回盘符p = sp.Popen(['powershell', '-Command',f'echo "$((Mount-DiskImage -ImagePath "{fn_iso}" | Get-Volume).DriveLetter):"'],stdout=sp.PIPE,encoding='utf-8',)mount_path = p.stdout.read().strip()# 拷贝目标文件 cp_with_level(fns_to_extract, folder_store, mount_path)# 取消挂载p = sp.Popen(['powershell', '-Command',f'Dismount-DiskImage -ImagePath {fn_iso}',])p.wait()else: # linux# 挂载isotmp_dir = TemporaryDirectory()mount_path = os.path.join(tmp_dir.name, 'tmp_mount')os.makedirs(mount_path, exist_ok=True)p = sp.Popen(['mount', fn_iso, mount_path])p.wait()# 拷贝目标文件 cp_with_level(fns_to_extract, folder_store, mount_path)# 取消挂载p = sp.Popen(['umount', mount_path])p.wait()