brainage.egloos.com

포토로그



사진의 찍은 날자로 파일이름 변경 - powershell 매크로 by 천하귀남

사진을 관리하다보면 기왕이면 사진찍은 날짜로 파일이름이 되있을때 여러모로 편리합니다. 헌데 이런기능을 제대로 지원안하는 카메라도 많아서 좀 불편합니다. 여기에 일반적인 파일의 수정날짜는 실제 사진 촬영일과 다른경우도 있어서 사진내에 촬영일자가 저장된 EXIF값을 읽어 처리해주는 프로그램도 필요합니다. 헌데 이런것이 무료 프로그램에는 별로 없더군요.

마침 윈도우8에 파워쉘이라는 프로그램이 보이길래 이걸로 만들어 봤습니다. 파워쉘자체는 추가된지가 오래되 XP등에도 사용가능한데 여기서는 동작확인을 못했습니다.

<#특정 폴더의 모든JPG이미지 파일에서 exif정보를 읽어 파일명을 생성(수정)일_시간 형태로 바꾸는 윈도우 파워셀 프로그램
G:\temp\287CANON\IMG_9869.JPG 에서
G:\temp\287CANON\IMG_20121106_224118.jpg 로 변경
#>



#폴더명 입력
$dirInfo = "G:\temp\287CANON\"

#이름이 중복될경우 붙일 임시번호
[int] $indexNum = 1;
$prefix_old = "";

Get-ChildItem $dirInfo -Filter *.jpg |
% {



foreach ($fileInfo in $_)
{
[System.IO.FileStream]$fReader = $fileInfo.OpenRead();

if (-not ($fileInfo -eq $null))
{


$dateTaken = "";

#exif에서 날자 얻어오기
try
{
$image = [System.Drawing.Imaging.Metafile]::FromStream($fReader,"true","false");
$exifDT = $image.GetPropertyItem('36867'); # Date taken
$exifDtString = [System.Text.Encoding]::ASCII.GetString($exifDT.Value);
$dateTaken = [datetime]::ParseExact($exifDtString,"yyyy:MM:dd HH:mm:ss`0",$Null);

}
catch {}
$fReader.Close();

#만약 EXif값이 없거나 날자값이 없을경우 파일 수정일자로 이름변경
if ($dateTaken -eq ""){
$dateTaken = $fileInfo.LastWriteTime;
}

#날자를 IMG_20121007_135111의 문자열형태로 변경
$prefix = [string]::Format("IMG_{0:yyyyMMdd}_{0:HHmmss}", $dateTaken)


#만약 이전 파일과 같은 날자일경우 파일명 뒤에 001같은 3자리 일련번호 첨부
if($prefix_old -eq $prefix)
{
$indexString = [string]::Format("_{0:d3}", $indexNum);
$indexNum += 1;
}
else
{
$indexNum = 1;
$indexString = "";
}



#파일 이름 변경(직접 변경 안하고 변경된 이름으로 복사-혹시 모르니 ^^;)
copy $dirInfo$fileInfo $dirInfo$prefix$indexString.jpg;
#파일 이름 변경
#ren $dirInfo$fileInfo $dirInfo$prefix$indexString.jpg;


write $dirInfo$fileInfo $dirInfo$prefix$indexString.jpg;
write "----------------------";


$prefix_old = $prefix;

}

}
}


며칠전에 올린 파워셀 매크로기능의 완성판입니다. 이 파워쉘에 그냥 도스명령어가 먹힌다는걸 알고 마무리할수 있었습니다. 응용여하에 따라 많은 작업이 가능할겁니다. 지금 이것의 확장버전은 파일의 날자별로 폴더를 만들어 복사해 넣는것도 가능할듯합니다. 마우스 오른쪽 버튼등에 연결해 탐색기에서 자동분류되게 만드는것도 좋겠더군요.

P.S
헌데 지금보니 윈도우8 탐색기에 EXIF의 생성일자를 항목으로 추가해 자동정렬시키는 기능도 있군요. 이것도 유용할듯합니다. 이게 7부터 추가된건지는 모르겠는데 상당히 유용하군요.

덧글

  • costzero 2012/11/15 13:49 # 답글

    음 좋은 정보군요.
    게시판들도 사진들을 시간에 맞춰서 리네임을 하는 설정이 있던데요.
    흥미롭습니다.
    역시 파일관리는 중요한 듯 합니다.
  • 천하귀남 2012/11/15 16:06 #

    새로 구한 이미지관리 프로그램의 기능이 부실해 알아보다 보니 직접 만들게 됬군요.
    혹여 누군가 검색해서 도움될까해 올려둡니다.
  • 미련곰탱 2013/07/16 11:26 # 삭제 답글

    안녕하세요~ 파워쉘 자료를 찾다가 우연히 들어왔습니다만.. 제가 파워쉘을 잘 모릅니다..ㅜㅜ
    서버에 현재 팩스가 pdf로 저장되는 폴더가 있습니다만..
    파일이 많아서 하루가 지나면 지난 파일들은 해당 날짜 폴더를 생성하여 그 폴더에 pdf 파일이 들어가도록 하고 싶습니다만..
    어떻게 해야 할지 감이 도저히 잡히지 않네요..
    예를 들어 오늘이 7월 16일이면..7월 17일날 16일날 파일들은 16일 폴더를 자동생성하여 16일 폴더에 16일들 들어왔던 파일들을 넣고 싶습니다.. 새벽에 자동으로 스크립트가 실행되도록 하고 싶구요..
    도움 부탁 드립니다..ㅜㅜ 감사합니다!
  • 천하귀남 2013/07/19 16:02 #

    답변이 늦어 죄송합니다. 회사업무때문에 오늘에야 테스트를 해볼수 있었군요.
    굳이 파워쉘을 쓰지 않으셔도 됩니다.

    @echo off
    for %%a in (%date%) do SET day=%%a
    md C:battest%day%
    xcopy C:/battest/*.* C:/battest/%day% /c /y /i /k

    이런 내용의 배치 파일을 만들어 이 배치 파일을 일정 시간마다 돌리는 윈도우스케쥴러에 등록시키시면 될듯합니다.
    배치파일과 스캐줄려를 약간만 더 검색하시면 될듯합니다.
  • 미련곰탱 2013/07/26 07:16 # 삭제 답글

    안녕하세요! ㅎㅎ 답변 감사 드립니다! 오늘 테스트 해봐야겠네요~ ㅋㅋ
    진심으로 감사합니다!
댓글 입력 영역
* 비로그인 덧글의 IP 전체보기를 설정한 이글루입니다.

구글 애널리틱스

통계 위젯 (화이트)

39347
1917
6527973

2019 대표이글루_IT

이 이글루를 링크한 사람 (화이트)

412

당부드리는 말

블로그 사진을 포함한 전체가 아닌 일부의 내용은 얼마든지 사용하셔도 상관없습니다.

상대방을 존중하는 생각이 있다면 욕설과 과도한 비아냥은 자제를 부탁드립니다. 정도가 심하거나 비로그인의 글은 임의 삭제 가능함을 알려드립니다.

A타입 클린 캠페인 위젯

방문자

Map