Python& rsync:如何处理相同的文件名?

时间:2018-04-04 15:05:40

标签: python filenames rsync

我正在使用rsync自动将文件复制到远程服务器。由于我的内置硬盘空间有限,我也会使用rsync随后在成功上传后将这些文件(即使用--remove-source-files)移动到外部硬盘。

这些文件是使用远程摄像头捕获应用程序拍摄的照片,该应用程序按顺序命名文件(DSC0001.JPGDSC0002.JPG等)。该序列似乎特定于“会话”:如果我退出远程捕获应用程序并再次启动它,它将从1开始(假设文件夹为空)。

我用Python编写了所有脚本(2.6,因为在非常旧的MacBook上运行),所以如果发生任何崩溃,它会重新启动。现在,出现了问题:远程捕获应用程序是否应该崩溃并重新启动,rsync是否应该刚刚完成上传&移动所有文件,然后JPG编号将再次从1开始。随后,rsync将再次上传&移动新文件时,会出现名称冲突,因为外部硬盘已经存在DSC0001.JPG

From what I gatherrsync只会覆盖副本,除非我指定--ignore-existing。但在这种情况下,新的DSC0001.JPG(和所有后续图像)不再同步。有没有办法使用rsync解决这个问题,我上面链接的帖子错过了,或者最好在Python脚本中处理这个问题(如果是的话,怎么做?)?谢谢!

1 个答案:

答案 0 :(得分:0)

我最终选择了一种按创建日期重新命名文件的方法。在做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