Python & rsync: 如何处理相同的文件名?
Python & rsync: how to deal with identical filenames?
我正在使用 rsync
自动将文件复制到远程服务器。由于 space 在我的内部硬盘上受到限制,我还使用 rsync
在成功上传后将这些文件(即使用 --remove-source-files
)随后移动到外部硬盘。
这些文件是使用远程相机捕获应用程序拍摄的照片,该应用程序按顺序命名文件(DSC0001.JPG
、DSC0002.JPG
等)。该序列似乎特定于 "session":如果我退出远程捕获应用程序并再次启动它,它将从 1 开始(假设文件夹为空)。
我在 Python 中编写了所有脚本(2.6,因为 运行 在非常旧的 MacBook 上),所以如果有任何崩溃,它会再次重新启动。现在,问题来了:如果远程捕获应用程序崩溃并重新启动,并且 rsync
刚刚完成所有文件的上传和移动,那么 JPG 编号将从 1 重新开始。随后,当 rsync
将再次上传和移动新文件,将出现名称冲突,因为 DSC0001.JPG
已经存在于外部硬盘上。
From what I gather、rsync
将简单地覆盖副本,除非我指定 --ignore-existing
。但在那种情况下,新的 DSC0001.JPG
(以及所有后续图像)不再同步。有没有办法使用 rsync
来解决这个问题 post I link 上面错过了,或者最好在 Python 脚本中处理这个问题(如果是的话, 如何?)?谢谢!
在执行 rsync
之前,我最终采用了一种按创建日期和时间重命名文件的方法(因此它始终是唯一的)。在 https://codereview.stackexchange.com/a/113684 找到答案:
import glob
from PIL import Image # Python Image Library
from PIL.ExifTags import TAGS
def get_exif(fn):
ret = {}
i = Image.open(fn)
info = i._getexif()
for tag, value in info.items():
decoded = TAGS.get(tag, tag)
ret[decoded] = value
return ret
allImageFiles = glob.glob(pathToFolder + "*.JPG")
for imageFile in imagefiles:
number = 0 # for duplicate check below
time = get_exif(imageFile)["DateTimeOriginal"]
time = time.replace(":", "")
time = time.replace(" ", "_")
new_name = pathToTempSyncFolder + "DSC_" + time + ".JPG"
if new_name == imageFile: # if file already has desired name, end current iteration of 'for'-loop (i.e., do not rename)
print(new_name, "already ok")
continue
while os.path.exists(new_name): # safety check for duplicates
number += 1
new_name = pathToFolder + "DSC_" + time + "_MAYBE_DUPLICATE_"+str(number)+".JPG"
os.rename(imageFile, new_name) # RENAME
我正在使用 rsync
自动将文件复制到远程服务器。由于 space 在我的内部硬盘上受到限制,我还使用 rsync
在成功上传后将这些文件(即使用 --remove-source-files
)随后移动到外部硬盘。
这些文件是使用远程相机捕获应用程序拍摄的照片,该应用程序按顺序命名文件(DSC0001.JPG
、DSC0002.JPG
等)。该序列似乎特定于 "session":如果我退出远程捕获应用程序并再次启动它,它将从 1 开始(假设文件夹为空)。
我在 Python 中编写了所有脚本(2.6,因为 运行 在非常旧的 MacBook 上),所以如果有任何崩溃,它会再次重新启动。现在,问题来了:如果远程捕获应用程序崩溃并重新启动,并且 rsync
刚刚完成所有文件的上传和移动,那么 JPG 编号将从 1 重新开始。随后,当 rsync
将再次上传和移动新文件,将出现名称冲突,因为 DSC0001.JPG
已经存在于外部硬盘上。
From what I gather、rsync
将简单地覆盖副本,除非我指定 --ignore-existing
。但在那种情况下,新的 DSC0001.JPG
(以及所有后续图像)不再同步。有没有办法使用 rsync
来解决这个问题 post I link 上面错过了,或者最好在 Python 脚本中处理这个问题(如果是的话, 如何?)?谢谢!
在执行 rsync
之前,我最终采用了一种按创建日期和时间重命名文件的方法(因此它始终是唯一的)。在 https://codereview.stackexchange.com/a/113684 找到答案:
import glob
from PIL import Image # Python Image Library
from PIL.ExifTags import TAGS
def get_exif(fn):
ret = {}
i = Image.open(fn)
info = i._getexif()
for tag, value in info.items():
decoded = TAGS.get(tag, tag)
ret[decoded] = value
return ret
allImageFiles = glob.glob(pathToFolder + "*.JPG")
for imageFile in imagefiles:
number = 0 # for duplicate check below
time = get_exif(imageFile)["DateTimeOriginal"]
time = time.replace(":", "")
time = time.replace(" ", "_")
new_name = pathToTempSyncFolder + "DSC_" + time + ".JPG"
if new_name == imageFile: # if file already has desired name, end current iteration of 'for'-loop (i.e., do not rename)
print(new_name, "already ok")
continue
while os.path.exists(new_name): # safety check for duplicates
number += 1
new_name = pathToFolder + "DSC_" + time + "_MAYBE_DUPLICATE_"+str(number)+".JPG"
os.rename(imageFile, new_name) # RENAME