基于EXIF时间从多目录复制图片至新目标的技术求助
按EXIF时间批量复制图片到目标路径的解决方案
针对你需要从多个嵌套目录(dir1、dir2及其子目录)中提取带EXIF时间的图片并复制到新路径的需求,我给你准备了两种实用方案,你可以根据自己的习惯选择:
方案一:用命令行工具(exiftool + find)快速实现
如果你习惯用终端操作,这个方案无需写代码,直接组合工具就能完成:
步骤1:安装依赖工具
首先确保你的系统上安装了exiftool(用来读取图片EXIF信息)和find(系统自带,用来遍历目录):
- Linux/macOS:可以用包管理器安装,比如
brew install exiftool(macOS)或者sudo apt install libimage-exiftool-perl(Debian/Ubuntu) - Windows:可以从官方下载exiftool,添加到系统PATH里即可
步骤2:执行复制命令
假设你的目标路径是/path/to/target,执行以下命令:
find /path/to/root -type f \( -iname "*.jpg" -o -iname "*.png" -o -iname "*.jpeg" \) -exec sh -c ' for img do # 读取图片的EXIF拍摄时间(这里用DateTimeOriginal,也可以根据需求换其他时间字段) exif_time=$(exiftool -DateTimeOriginal -s3 "$img") # 如果EXIF时间存在,就复制到目标路径 if [ -n "$exif_time" ]; then cp "$img" /path/to/target/ echo "复制成功:$img" fi done ' sh {} +
命令说明
find /path/to/root:从你的根目录开始遍历所有文件-type f \( -iname "*.jpg" ... \):筛选出所有图片格式文件(不区分大小写)-exec sh -c '...' sh {} +:对每个找到的图片执行后续脚本exiftool -DateTimeOriginal -s3 "$img":提取图片的原始拍摄时间,-s3表示只输出时间值- 如果EXIF时间不为空,就用
cp复制到目标路径
方案二:用Python脚本实现更灵活的逻辑
如果你需要自定义筛选规则(比如只复制某个时间段的图片),Python脚本会更适合:
步骤1:安装依赖库
先安装读取EXIF的库,比如exifread(轻量易用):
pip install exifread
步骤2:编写Python脚本
import os import shutil import exifread def copy_images_by_exif(root_dir, target_dir): # 创建目标目录(如果不存在) os.makedirs(target_dir, exist_ok=True) # 遍历根目录下的所有文件 for root, dirs, files in os.walk(root_dir): for file in files: # 筛选图片文件 if file.lower().endswith(('.jpg', '.jpeg', '.png', '.gif')): img_path = os.path.join(root, file) try: # 读取EXIF信息 with open(img_path, 'rb') as f: tags = exifread.process_file(f) # 获取拍摄时间(DateTimeOriginal是常用的拍摄时间字段) if 'EXIF DateTimeOriginal' in tags: exif_time = str(tags['EXIF DateTimeOriginal']) print(f"找到带EXIF时间的图片:{img_path} | 时间:{exif_time}") # 复制到目标路径 shutil.copy2(img_path, target_dir) except Exception as e: print(f"处理图片失败:{img_path} | 错误:{e}") # 替换成你的根目录和目标路径 ROOT_DIR = '/path/to/your/root' TARGET_DIR = '/path/to/your/target' copy_images_by_exif(ROOT_DIR, TARGET_DIR) print("所有符合条件的图片已复制完成!")
自定义扩展
如果你想只复制某个时间段的图片(比如你目录里标注的10:05到10:10的图片),可以在获取exif_time后添加判断逻辑:
# 示例:只复制10:05:00到10:10:00之间的图片 time_str = exif_time.split(' ')[1] # 提取时间部分,比如"10:05:05" if "10:05:00" <= time_str <= "10:10:00": shutil.copy2(img_path, target_dir)
两种方案都能帮你高效完成需求,命令行适合快速操作,脚本适合自定义场景,你可以按需选择~
内容的提问来源于stack exchange,提问作者user9046520
相关产品推荐
相关产品推荐

