将照片从现有文件夹结构重新组织为新结构
我有一个photoys目录,它已经(重新)组织到一个目录结构中: 年/月/日 。
除了它不是一个方便的分组,它有错误。 例如; 在我2007年的文件夹中有2010年的图片。
我知道有一些程序(比如Shotwell)来组织照片,但是它们很难对付我拥有的大量图片,而且它们似乎都维持着现有的文件结构。
我想做的是从文件夹中取出所有图片并根据结构正确重新组织: 年/月 。 这样我就可以轻松浏览并将它们放在相册中。
这样做是否会有一种防止白痴的方式? 此外,链接到有用的论坛讨论可以帮助我很多。
用于将照片重新组织到/年/月目录中的脚本
下面的脚本执行以下操作:
- 它决定了拍摄照片的月份
- 在目标目录中,它每年创建(如有必要)子目录(如果找到照片)
- 在这些年份目录中,它每月创建子目录
- 如果脚本无法找到合适的日期,则会创建一个名为“未确定”的文件夹
每年的文件夹
每月子文件夹
处理重复:
-
重要的是以适当的方式处理重复:数码相机以类似命名的系列拍摄(如
IMG_1.jpeg
,IMG_2.jpeg
等)。 因此,需要自动重命名重复项,否则脚本将中断或大量照片将丢失。
该脚本重命名重复项,如:IMG_1.jpeg, duplicate_1_IMG_1.jpeg, duplicate_2_IMG_1.jpeg etc
如何使用
-
该脚本使用
exif
来读取元数据:sudo apt-get install exif
-
将下面的脚本复制到一个空文件中。
-
在脚本的head部分中,定义要将照片复制到的目录(目标目录):
#--- save_to = "/targeted/directory" #---
-
将脚本保存为
reorganize.py
。 - 如有必要,创建目标(上级)目录
-
使用源目录(带有照片的文件夹)作为参数运行脚本,命令为:
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 \ “-filenameExiftool可以做的远不止这些。
使用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
进行更改