발단
어제 오랜만에 가족끼리 셀프사진관에 방문하여 사진을 촬영했는데, 카메라에 날짜 설정이 잘 되어있지 않았는지 촬영한 사진 280장 모두 실제 촬영일시와 대략 22시간 20분 정도 차이가 나 있었다.
문제
육아기 아빠는 시간이 없다. 아이들이 자는 시간을 이용하여 빠르게 사진의 시간정보를 수정하여 NAS에 올려야 했고, 나는 Chat GPT에 이 문제를 해결할 수 있는 방법을 물어봤다.
프롬프트 내용은 다음과 같다.
아래 요구사항을 만족하는 powershell 스크립트를 하나 만들어줘
- C:\Users\USER_NAME\Downloads\9999\9999\2024_05_17 폴더에 .JPG 파일이 280개 있어
- 2. 위 폴더의 모든 파일의 EXIF 정보 중 찍은 날짜 정보값에서 22시간 20분을 더해서 저장
해결
Chat GPT의 해법은 꽤나 정확했다. 아래와 같은 응답을 주었고, 아무런 에러 없이 작성된 스크립트로 280장의 사진의 날짜정보를 수정할 수 있었다.
Chat GPT 응답
PowerShell을 사용하여 지정된 폴더의 모든 .JPG 파일의 EXIF 정보를 수정하는 스크립트를 작성할 수 있습니다. 이 스크립트는 ExifTool이라는 도구를 사용하여 EXIF 메타데이터를 읽고 수정합니다. ExifTool을 먼저 설치해야 합니다.
ExifTool 설치
- ExifTool 다운로드 페이지에서 Windows용 ExifTool을 다운로드하고 설치합니다.
- ExifTool이 설치된 디렉터리를 시스템의 PATH 환경 변수에 추가합니다.
PowerShell 스크립트 작성
다음은 요구 사항을 충족하는 PowerShell 스크립트입니다.
# ExifTool 경로를 지정합니다. 설치한 경로에 맞게 수정하세요.
$exifToolPath = "C:\Path\To\ExifTool\exiftool.exe"
# 작업할 폴더 경로를 지정합니다.
$folderPath = "C:\Users\USER_NAME\Downloads\9999\9999\2024_05_17"
# 폴더 내의 모든 .JPG 파일을 가져옵니다.
$jpgFiles = Get-ChildItem -Path $folderPath -Filter *.JPG
# 22시간 20분을 더할 시간 간격을 설정합니다.
$timeToAdd = New-TimeSpan -Hours 22 -Minutes 20
foreach ($file in $jpgFiles) {
# EXIF에서 찍은 날짜 정보를 읽습니다.
$dateTimeOriginal = & $exifToolPath -DateTimeOriginal -T $file.FullName
if ($dateTimeOriginal) {
# 찍은 날짜 정보를 [DateTime] 객체로 변환합니다.
$dateTimeOriginal = [DateTime]::ParseExact($dateTimeOriginal, "yyyy:MM:dd HH:mm:ss", $null)
# 22시간 20분을 더합니다.
$newDateTime = $dateTimeOriginal.Add($timeToAdd)
# 새로운 날짜 시간 문자열을 생성합니다.
$newDateTimeString = $newDateTime.ToString("yyyy:MM:dd HH:mm:ss")
# EXIF 정보를 업데이트합니다.
& $exifToolPath -DateTimeOriginal="$newDateTimeString" $file.FullName
} else {
Write-Host "파일 '$($file.FullName)'에서 찍은 날짜 정보를 읽을 수 없습니다."
}
}
스크립트 실행 방법
- 위 스크립트를
UpdateExifDates.ps1
로 저장합니다.
- PowerShell을 관리자 권한으로 실행합니다.
UpdateExifDates.ps1
파일이 있는 디렉터리로 이동합니다.
- 다음 명령어를 입력하여 스크립트를 실행합니다.
PS> .\UpdateExifDates.ps1
이 스크립트는 지정된 폴더의 모든 .JPG 파일을 대상으로 EXIF 데이터의 DateTimeOriginal 필드에 22시간 20분을 더한 후 업데이트합니다. ExifTool이 올바르게 설치되고 시스템의 PATH에 추가되어 있어야 합니다.