單反同步刪除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目錄
- 預覽刪除操作
SyncDeleteRawFiles.py -a /sdcard/DCIM/NIKON -r "/Volumes/NIKON D750/DCIM/106ND750"
- 執行刪除操作
SyncDeleteRawFiles.py -a /sdcard/DCIM/NIKON -r "/Volumes/NIKON D750/DCIM/106ND750" -d
同步Jpeg目錄在本機上,則使用-j
選項執行Jpeg目錄
- 預覽刪除操作
SyncDeleteRawFiles.py -j /Users/kevin/Pictures/亞庇照片 -r "/Volumes/NIKON D750/DCIM/106ND750"
- 執行刪除操作
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 張