将照片从现有文件夹结构重新组织为新结构

我有一个photoys目录,它已经(重新)组织到一个目录结构中: 年/月/日

除了它不是一个方便的分组,它有错误。 例如; 在我2007年的文件夹中有2010年的图片。

我知道有一些程序(比如Shotwell)来组织照片,但是它们很难对付我拥有的大量图片,而且它们似乎都维持着现有的文件结构。

我想做的是从文件夹中取出所有图片并根据结构正确重新组织: 年/月 。 这样我就可以轻松浏览并将它们放在相册中。

这样做是否会有一种防止白痴的方式? 此外,链接到有用的论坛讨论可以帮助我很多。

用于将照片重新组织到/年/月目录中的脚本

下面的脚本执行以下操作:

  • 它决定了拍摄照片的月份
  • 在目标目录中,它每年创建(如有必要)子目录(如果找到照片)
  • 在这些年份目录中,它每月创建子目录
  • 如果脚本无法找到合适的日期,则会创建一个名为“未确定”的文件夹

每年的文件夹

在此处输入图像描述

每月子文件夹

在此处输入图像描述

处理重复:

  • 重要的是以适当的方式处理重复:数码相机以类似命名的系列拍摄(如IMG_1.jpegIMG_2.jpeg等)。 因此,需要自动重命名重复项,否则脚本将中断或大量照片将丢失。
    该脚本重命名重复项,如:

     IMG_1.jpeg, duplicate_1_IMG_1.jpeg, duplicate_2_IMG_1.jpeg etc 

如何使用

  1. 该脚本使用exif来读取元数据:

     sudo apt-get install exif 
  2. 将下面的脚本复制到一个空文件中。

  3. 在脚本的head部分中,定义要将照片复制到的目录(目标目录):

     #--- save_to = "/targeted/directory" #--- 
  4. 将脚本保存为reorganize.py

  5. 如有必要,创建目标(上级)目录
  6. 使用源目录(带有照片的文件夹)作为参数运行脚本,命令为:

     python3 /path/to/reorganize.py  

    我在脚本中设置了目标目录,因为您可能希望将其他dorectories(新图片)添加到同一目录中,自动组织,而目录在将来的情况下会有所不同。

重要笔记

  • 每个相机的数据格式可能略有不同。 在脚本中,我考虑了以下格式:

     Datum en tijd |2013:08:18 15:58:46 

     Datum en tijd |2013-08-18 20:21:32 

    在其他相机上可能会有所不同。 如果脚本无法正常运行,则需要发布命令exif 的输出,但最有可能的是,它将按exif 工作。

  • 该脚本将照片复制到新的(子)导演中,因为在您确认一切顺利之前,您可能不想弄乱原始目录。 我想你移动文件,更换行:

     shutil.copyfile(file, newfile) 

    通过:

     shutil.move(file, newfile) 

剧本

 #!/usr/bin/env python3 import subprocess import os import sys import shutil #--- save_to = "/targeted/directory" #--- directory = sys.argv[1] if not os.path.exists(save_to): os.mkdir(save_to) get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8") def check_dir(dr): if not os.path.exists(dr): os.mkdir(dr) def rename_dups(target_dir, name): n = 1; name_orig = name while os.path.exists(target_dir+"/"+name): name = "duplicate_"+str(n)+"_"+name_orig n = n+1 return target_dir+"/"+name for root, dirs, files in os.walk(directory): for name in files: file = root+"/"+name try: date = [l for l in get("exif "+'"'+file+'"').splitlines()\ if "Dat" in l][0].split("|")[1].split()[0] if "-" in date: date = date.split("-")[:2] elif ":" in date: date = date.split(":")[:2] targeted_dir = save_to+"/"+date[0] check_dir(targeted_dir) sub_dir = targeted_dir+"/"+date[1] except: sub_dir = save_to+"/"+"undetermined" check_dir(sub_dir) newfile = rename_dups(sub_dir, name) shutil.copyfile(file, newfile) 

http://owl.phy.queensu.ca/~phil/exiftool/
下载包。
查找“安装说明”( http://owl.phy.queensu.ca/~phil/exiftool/install.html

未经测试的bash脚本,使用上面的“exiftool”。

 $ cat exifto 
 #!/斌/庆典

 exiftool -r \
 -d $ HOME /图片/ Original_Images /%Y /%m /%d / %% f。%% e \
  “-filename 

Exiftool可以做的远不止这些。

使用Python实用程序

@andrewning为此目的制作了一个工具,让您可以处理这个问题,以及您遇到的任何边缘情况

1.安装

安装就像运行pip install sortphotos一样简单

2.用法

安装后,它作为sortphotos调用的命令存在。 为了根据您在问题中的需要对照片进行排序,只需将其运行为

 sortphotos -r ./source ./destination --sort %Y/%m-%b 

这里由--sort给出的格式字符串决定了source目录中的照片被组织到destination目录中的结构,在这里它对文件进行排序,如下所示:

格式字符串可以指定为strftime规范中使用的/ (正斜杠)分隔子目录

3.附加说明

名称中的任何冲突(即同一个月中具有相同名称的两张照片)将自动附加一个数字。 如果您只想模拟文件的移动以查看是否所有内容都是有序的,只需使用-t标志,如下所示:

 sortphotos -tr ./source ./destination --sort %Y/%m-%b 

任何没有有效EXIF数据的文件都存储在默认情况下名为Unknown的子文件夹中,但可以通过选项--unknown-dir进行更改