在 macOS 上导出 iOS的照片:https://sspai.com/post/63265
得到的是类似 IMG_XXX 这样的文件,我希望将文件名替换为创建(拍摄日期)
使用python 的 os.stat
方法 ,得到的是这样的结果:
file_path = '/Users/xx/Pictures/照片2202/IMG_2627.jpeg'
print(os.stat(file_path))
# os.stat_result(st_mode=33188, st_ino=13004319047, st_dev=16777223, st_nlink=1, st_uid=501, st_gid=20, st_size=388475, st_atime=1668682186, st_mtime=1668501156, st_ctime=1668501156)
这里的信息有限,更多信息需要查看元数据。
osxmetadata 这样的模块,按道理是可以得到更到的元数据信息,但是安装出现错误;完成更重要,想到不妨使用 macOS 的文件命令来解决问题。
osxmetadata : https://github.com/RhetTbull/osxmetadata
这两个命令都可以得到我想要的初始时间,不过 mdls 更好用一些(格式更清晰),这里使用它。
mdls 更多信息可见:《macOS - mdls, mdfind, mdutil, xargs 命令使用》
https://blog.csdn.net/lovechris00/article/details/125406449
这两个命令调用结果:
$ file /Users/xx/Pictures/照片2202/IMG_2627.jpeg
/Users/xx/Pictures/照片2202/IMG_2627.jpeg: JPEG image data, JFIF standard 1.02, resolution (DPI), density 72x72, segment length 16, Exif Standard: [TIFF image data, big-endian, direntries=7, orientation=upper-left, xresolution=98, yresolution=106, resolutionunit=2, datetime=2021:09:05 22:14:38TIFF image data, big-endian, direntries=7, orientation=upper-left, xresolution=98, yresolution=106, resolutionunit=2, datetime=2021:09:05 22:14:38], baseline, precision 8, 1080x1440, components 3
$ mdls -name kMDItemContentCreationDate /Users/xx/Pictures/照片2202/IMG_2627.jpeg
kMDItemContentCreationDate = 2021-09-05 14:14:38 +0000
# 查看更多元数据
$ mdls /Users/xx/Pictures/照片2202/IMG_2627.jpeg
_kMDItemDisplayNameWithExtensions = "IMG_2627.jpeg"
kMDItemBitsPerSample = 24
kMDItemColorSpace = "RGB"
kMDItemContentCreationDate = 2021-09-05 14:14:38 +0000
kMDItemContentCreationDate_Ranking = 2021-09-05 00:00:00 +0000
kMDItemContentModificationDate = 2021-09-05 14:14:38 +0000
kMDItemContentModificationDate_Ranking = 2021-09-05 00:00:00 +0000
kMDItemContentType = "public.jpeg"
kMDItemContentTypeTree = (
"public.jpeg",
"public.image",
"public.data",
"public.item",
"public.content"
)
kMDItemDateAdded = 2022-11-15 08:32:36 +0000
kMDItemDateAdded_Ranking = 2022-11-15 00:00:00 +0000
kMDItemDisplayName = "IMG_2627.jpeg"
kMDItemDocumentIdentifier = 0
kMDItemEXIFVersion = "2.2.1"
kMDItemFSContentChangeDate = 2022-11-15 08:32:36 +0000
kMDItemFSCreationDate = 2022-11-15 08:32:36 +0000
kMDItemFSCreatorCode = ""
kMDItemFSFinderFlags = 0
kMDItemFSHasCustomIcon = (null)
kMDItemFSInvisible = 0
kMDItemFSIsExtensionHidden = 0
kMDItemFSIsStationery = (null)
kMDItemFSLabel = 0
kMDItemFSName = "IMG_2627.jpeg"
kMDItemFSNodeCount = (null)
kMDItemFSOwnerGroupID = 20
kMDItemFSOwnerUserID = 501
kMDItemFSSize = 388475
kMDItemFSTypeCode = ""
kMDItemHasAlphaChannel = 0
kMDItemInterestingDate_Ranking = 2021-09-05 00:00:00 +0000
kMDItemKind = "JPEG图像"
kMDItemLogicalSize = 388475
kMDItemOrientation = 1
kMDItemPhysicalSize = 389120
kMDItemPixelCount = 1555200
kMDItemPixelHeight = 1440
kMDItemPixelWidth = 1080
kMDItemProfileName = "sRGB IEC61966-2.1"
kMDItemResolutionHeightDPI = 72
kMDItemResolutionWidthDPI = 72
(base)
import os
import re
import sys
import shutil
from datetime import datetime, timezone, timedelta
def get_file_date(file_path):
script = f'mdls -name kMDItemContentCreationDate {file_path}'
ret = os.popen(script).read()
print(ret)
date_str = ret.replace('kMDItemContentCreationDate = ', '').strip()[:19].strip()
if len(date_str) < 18:
print('xx ', file_path)
return None
d1 = datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S')
tz = timezone(timedelta(hours=-8))
d2 = d1.astimezone(tz).strftime('%Y_%m_%d_%H_%M_%S')
# print(d2, type(d2))
return d2
def read_dir(src_dir):
save_dir = os.path.join(src_dir, 'storage')
if not os.path.isdir(save_dir):os.makedirs(save_dir)
files = os.listdir(src_dir)
print('-- ', len(files))
#files.sort()
i = 0
for file_name in files:
file_path = os.path.join(src_dir, file_name)
# 执行shell 命令时,遇到括号可能执行失败。这里暴力解决:将文件保存在另一个名字下。
if file_name.find('(') != -1:
path1 = os.path.join(src_dir, file_name.replace('(', '_').replace(')', '_').replace(' ', '_').strip())
shutil.move(file_path, path1)
file_path = path1
try:
create_date = get_file_date(file_path)
if create_date == None:continue
suf = os.path.splitext(file_path)[-1]
# print(suf)
save_path = os.path.join(save_dir, f'{create_date}{suf}')
if os.path.isfile(save_path):
print('xx exist ', file_path, save_path)
continue
i += 1
if i%1000 == 1:print(i)
shutil.move(file_path, save_path)
except Exception as err:
print('xx ', err, file_path)
if __name__ == '__main__':
src_dir = sys.argv[1]
read_dir(src_dir)
伊织 2022-11-17(四)