reg_replace 로 한번에 여러 파일 이름 바꾸기

우수한

맨날 보고만 가기 미안해서….. 초허접 강좌 하나 올립니다.
중급자 이상은 보지 마세요.

갑자기 후배가 이런 부탁을 하는군요.
서버에 html123_image345.jpg, html123_image456.gif 이런 파일이 있는데
이걸 html123_image346.jpg, html123_image457.jpg 라는 이름으로 바꾸고 싶다구요.
즉 파일 이름에 들어있는 숫자를 찾아내서 그 숫자만 1씩 증가를 시키고 싶다는 겁니다.
자, 한번 해볼까요.

// 먼저 간단히 환경설정을 잡아줍니다.

// 실행할 디렉토리 (물론 쓰기 퍼미션이 있어야겠죠)
$path = “./”;

// 파일이름에서 몇번째 나오는 숫자를 선택해 바꿀 것인가
$what_number = 2;

// 그럼 해당 디렉토리의 파일을 읽어옵니다.
$files=array();
if (is_dir($path)) {
$p = opendir($path);
while($name = readdir($p)) {
if (is_file(“$path/$name”)) $files[] = $name;
}
closedir($p);
}

//이제 파일 이름을 주욱 훑으면서 이름을 바꿔야 하는데요.
//잠깐, 주의할 게 있습니다. 456을 457로 바꾸는데, 이미 457이라는 파일이 존재하면 안되겠죠.
//그러니 역순으로 작업을 하기로 합시다.
rsort($files);

// 파일을 하나씩 살펴서 이름을 바꿉니다.
// 여기서 팁은 preg_replace 를 사용할때 e 플래그를 주면
// PHP코드를 사용할 수 있다는 겁니다.
$cnt=$success=0;
$pattern = “/(^D+”.str_repeat(“d+D+”, $what_number-1).”)(d+)/”;
foreach ($files as $filename) {
if (preg_match($pattern, $filename)) {
$new_filename = preg_replace($pattern.”e”, “‘\1’.(intval(‘\2’)
+1)”, $filename, 1);
echo $filename.”을 “.$new_filename.”으로 바꾸기…”;
if (@rename($filename, $new_filename)) {
echo “성공

“;
$success++;
} else echo “실패

“;
$cnt++;
}
}

echo $cnt.”개 파일 중에서 “.$success.”개 파일을 처리했습니다
“;

?>

이제 보면 아시겠지만, 파일 이름이 숫자로 시작되는 경우에는
위의 이름 변경 기능이 작동하지 않습니다. 다른 버그가 있을 수도….. –;;
후배의 필요에 따라 급조한 거고, 실제 쓰일 일이 별로 없는 스크립트입니다만
필요하신 분들은 좀더 유연하게 만들어서 쓰실 수 있겠죠.
이건 do it yourself! 🙂