單反同步刪除RAW文件

單反同步刪除RAW文件

我使用的是D750,使用jpeg+raw雙存儲的方式。在旅行的過程中,通過相機自帶wifi,將jpeg照片同步到手機,然後就可以瀏覽,刪除,修圖,發票圈了。這樣在旅行的過程中就篩選了大部分照片,回來的時候就不用那麼辛苦的篩選照片了。畢竟快門一時爽,選片火葬場!但是手機只是篩選了jpeg,回到家導入電腦的是raw,這裏就需要一個工具同步刪除raw文件。

所以就寫了一個同步刪除raw文件的python腳本,腳本只在Mac上測試了,沒有在其它平臺測試

#!/usr/bin/env python3
# -- coding:utf-8 --
import os
import argparse
import subprocess


class FileStatus:
    def __init__(self, _file, delete=0):
        self.delete = delete
        self.filePath = _file
        self.baseName = os.path.basename(_file)
        self.fileName = os.path.splitext(self.baseName)[0]


def getAllFilesInDir(path):
    allFileStatus = []
    for parent, dirnames, filenames in os.walk(path):
        for file in filenames:
            if file.startswith('.'):
                continue
            file_path = os.path.join(parent, file)
            allFileStatus.append(FileStatus(file_path))
    return allFileStatus


def getRemoteAndroidJpegFiles(path):
    out_bytes = subprocess.check_output(['adb', 'shell', 'ls', path])
    out_string = out_bytes.decode("utf-8")
    allFilesList = out_string.splitlines()
    allFileStatus = []
    for file in allFilesList:
        ext = os.path.splitext(file)[1].lower()
        if ext == '.jpeg' or ext == '.jpg':
            if file.startswith('.'):
                continue
            file_path = os.path.join(path, file)
            allFileStatus.append(FileStatus(file_path))
    return allFileStatus


def parseArg():
    parser = argparse.ArgumentParser(description="與Jpeg文件夾同步,將Jpeg文件夾中已經刪除的圖片所對應的Raw文件也刪除。注意本腳本不考慮擴展名,需要你保證jpegDir"
                                                 "中只有jpeg文件,rawDir中只有raw文件")
    parser.add_argument('-j', '--jpegDir', nargs=1, type=str, help="JPEG文件目錄")
    parser.add_argument('-a', '--androidDir', nargs=1, type=str, help="Android JPEG文件目錄")
    parser.add_argument('-r', '--rawDir', nargs=1, type=str, help="RAW文件目錄,將會與JPEG目錄比較文件名(不包含擴展名)")
    parser.add_argument('-d', '--delete', action='store_true', help="執行刪除操作。如果不加此選項,將不執行刪除操作")
    return parser.parse_args()


def main():
    args = parseArg()

    if args.androidDir is not None:
        jpegDir = args.androidDir[0]
    else:
        jpegDir = args.jpegDir[0]
        if not os.path.exists(jpegDir):
            print('source directory not  exists!')
            exit(1)
        if not os.path.isdir(jpegDir):
            print('source directory is not a directory!')
            exit(1)
    rawDir = args.rawDir[0]  # 需要刪除的文件夾

    if not os.path.exists(rawDir):
        print('target directory not  exists!')
        exit(1)

    if not os.path.isdir(rawDir):
        print('target directory is not a directory!')
        exit(1)

    if args.androidDir is not None:
        allJpegFiles = getRemoteAndroidJpegFiles(jpegDir)

    else:
        allJpegFiles = getAllFilesInDir(jpegDir)

    allRawFiles = getAllFilesInDir(rawDir)

    for rawFile in allRawFiles:
        isDelete = True
        for jpegFile in allJpegFiles:
            if jpegFile.fileName == rawFile.fileName:
                isDelete = False
                break
        if isDelete:
            rawFile.delete = 1

    count = 0
    for rawFile in allRawFiles:
        if rawFile.delete == 1:
            count += 1
            # os.remove(file.file)
            print("%s 刪除" % rawFile.baseName)
        else:
            print("%s " % rawFile.baseName)
    print("\nRaw 總共 %d 張, 將要刪除 %d 張" % (len(allRawFiles), count))

    if args.delete:
        count = 0
        try:
            for rawFile in allRawFiles:
                if rawFile.delete == 1:
                    os.remove(rawFile.filePath)
                    count += 1
        finally:
            print("已刪除了 %d 張" % count)


if __name__ == "__main__":
    main()

使用說明:
同步jpeg目錄在andorid手機上,則打開手機調試功能,並在PC安裝adb前提下使用-a選項指定手機Jpeg目錄

  1. 預覽刪除操作
    SyncDeleteRawFiles.py -a /sdcard/DCIM/NIKON -r "/Volumes/NIKON D750/DCIM/106ND750"
  2. 執行刪除操作
    SyncDeleteRawFiles.py -a /sdcard/DCIM/NIKON -r "/Volumes/NIKON D750/DCIM/106ND750" -d

同步Jpeg目錄在本機上,則使用-j選項執行Jpeg目錄

  1. 預覽刪除操作
    SyncDeleteRawFiles.py -j /Users/kevin/Pictures/亞庇照片 -r "/Volumes/NIKON D750/DCIM/106ND750"
  2. 執行刪除操作
    SyncDeleteRawFiles.py -j /Users/kevin/Pictures/亞庇照片 -r "/Volumes/NIKON D750/DCIM/106ND750" -d

使用示例

/Users/kevin/WorkSpace/pythonWorkspace/Python/SyncDeleteRawFiles.py -a /sdcard/DCIM/NIKON -r "/Volumes/NIKON D750/DCIM/106ND750"
DSC_4974.NEF 
DSC_4975.NEF 
DSC_4976.NEF 
DSC_4977.NEF 
DSC_4978.NEF 
DSC_4979.NEF 
....
DSC_4983.NEF 
DSC_4984.NEF 
DSC_4985.NEF 
DSC_4988.NEF 刪除
DSC_4989.NEF 刪除
DSC_4990.NEF 刪除
DSC_4991.NEF 刪除
DSC_4992.NEF 刪除
DSC_4993.NEF 刪除
DSC_4994.NEF 刪除
DSC_4996.NEF 刪除
DSC_4997.NEF 刪除
DSC_4998.NEF 刪除
DSC_4999.NEF 刪除
DSC_5000.NEF 刪除
DSC_5001.NEF 刪除
DSC_5002.NEF 刪除
DSC_5003.NEF 刪除
DSC_5004.NEF 刪除
DSC_5005.NEF 刪除
DSC_5006.NEF 刪除
DSC_5007.NEF 刪除
DSC_5008.NEF 刪除
DSC_5009.NEF 刪除

Raw 總共 327 張, 將要刪除 21 張

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章