Powershell
2011. 02. 11.
안혁
http://hyok.kr


동영상 파일을 관리하다 보면 이름을 일괄적으로 변경해야 할 경우가 있습니다. 예를 들면, 자막을 받았는데, 동영상은 MOVE01.AVI, MOVIE02.AVI 이런 형태인데, 자막은 SUBTITLE01.SMI SUBTITLE02.SMI 형태로 되어 있어 SMI 파일의 이름을 AVI와 똑같이 변경해야 하는 경우가 그렇지요.

[code]
PS C:\test> $i=1; Get-ChildItem *.smi | ForEach-Object { $name=$_.Directory.FullName + "\newname" + $i.ToString("00") + ".smi"; Move-Item -LiteralPath $_.Name $name; $i++; }
[/code]

Get-ChildItem: 현재 폴더에 있는 SMI 확장자의 파일을 모두 가져와서
ForEach-Object: 하나씩 처리합니다. {}안에 $_라고 적으면 이 안에 순서대로 대입됩니다.
$_.Directory.FullName: $_는 FileInfo 타입입니다. 이는 파일 경로를 의미합니다.
$name: 원하는 파일 이름을 정하고([경로]\newname01.smi, [경로]\newname02.smi, ......)
Move-Item: 이름 변경 -  이름을 바꿔서 같은 폴더에 옮겼다고 생각하면 됩니다.
$i.ToString("00")이라고 하면 $i에 들어 있는 1, 2, 3이라는 값이 01, 02, 03으로 바뀝니다. 두 자리로 표현되도록 방법이죠. 보통 동영상의 이름에 사용하는 순서는 두자리 숫자를 사용하죠? 그래야 탐색기에서 순서대로 정렬 되니까요.

위 코드는 변경할 이름을 $name에 직접 지정하는 방식입니다만, 좀 더 생각해보면 avi파일의 이름을 가져와서 $name에 담도록 하면 이 명령을 사용할 때마다 변경하지 않아도 되겠군요.

위에서 Rename-Item 대신 Move-Item을 사용한 이유는 원본 파일 이름에 '[' 또는 ']'문자가 있는 경우 파일을 찾을 수 없다는 오류가 발생하기 때문입니다. 보통 동영상 파일의 이름에는 대괄호가 많이 사용되잖아요? 그래서 다른 방법을 찾아본 것입니다. (제 의견입니다만, 이는 버그라고 생각합니다. Rename-Item만을 단독으로 사용할 때면 `[ 또는 `]과 같이 표기하여 사용하겠지만, 파이프(|)는 앞 명령의 결과가 객체로 넘어오므로 문제가 없어야 하지 않을까요? Move-Item이 정상적으로 작동하는 것처럼......)

단, 위 명령은 다음을 전제로 합니다.
1. Get-ChildItem은 파일 이름 순서대로 결과를 돌려줍니다.
2. 원본 smi 파일의 순서는 1부터 1씩 증가합니다.
3. 현재 폴더에는 변경하고자 하는 smi파일만 존재합니다.
Posted by 안혁 windfruit