download this file: rename.php view text/plain: rename.php file encoding: UTF-8 [goback]
<?php
##
## rename files
## san2@2011.12.15: add urldecode
## san2@2011.02.05: new build
function preview_dorename($preview, $file, $t, &$renamed)
{
## preview
##
if($preview)
{
printf('%-50s=> %s'."\n",$file,$t);
return;
}
## do rename
##
if(rename($file,$t)) printf('%-50s=> %s'."\n",$file,$t);
else
{
printf('%-50s=> %s'."\n",$file,"XX Rename failure to $t");
$renamed[$i] = $file; // reset
}
}
## check OS
##
$iswin = preg_match('/WIN/',PHP_OS) ? TRUE : FALSE;
## check argv
##
$size = sizeof($_SERVER['argv']);
for($i=1; $i<$size; $i++)
{
$argv = $_SERVER['argv'][$i];
if(preg_match(';[-]+(test|preview);i',$argv)) $preview = TRUE;
else if(preg_match(';[-]+urldecode;i',$argv)) { $urldecode = TRUE; $pattern = '/.+/_urldecode_/';}
else if(preg_match(';^([^0-9a-zA-Z\\\\\s]).+\\1.*\\1[imsxeADSUXJu]*$;',$argv)) $pattern = $argv;
else if(preg_match(';^[^-]+;',$argv)) $path = $argv;
}
if(is_dir($path)) $path = preg_replace(';/+$;','',$path).'/*';
$files = glob($path);
if(!$files || !$pattern)
{
// error_log() not work in win32
if(!$pattern) echo "ERROR: preg-pattern $pattern\n";
if(!$files) echo "ERROR: target\n";
echo 'usage: php '.$_SERVER['argv'][0].' [--test|--preview] [--urldecode] <preg-pattern> <target>'."\n";
exit(1); // error
}
$dirname = dirname($path);
$delm = substr($pattern,0,1);
list(,$from,$to,$modx) = explode($delm,$pattern);
if($preview) echo "preview/test mode: Yes\n";
echo "target : $path \n";
## get fileinode
##
$finodes = array();
foreach($files AS $i=>$file)
{
if(!is_file($file)) continue; // directory or link ...
$finodes[$i] = fileinode($file);
}
$posts = array();
$renamed = $files;
foreach($finodes AS $i=>$inode)
{
$file = $files[$i];
$f = basename($file);
if($urldecode)
{
$f = urldecode($f);
$f = mb_check_encoding($f,'UTF-8') ? iconv('UTF-8','EUC-KR',$f) : $f;
$f = str_replace('/','',$f);
$f = str_replace('?','',$f);
$t = $dirname.'/'.$f;
}
else $t = $dirname.'/'.preg_replace($delm.$from.$delm.$modx,$to,$f);
## check is same name
##
if("$file" == "$t")
{
printf('%-50s%s'."\n",$file,'=> Skip(It\'s a self.)');
continue;
}
## check file exists(support preview mode)
##
if(!$iswin) // for Unix/Linux, but win32 do rename
{
$ekey = array_search($t,$renamed);
if($ekey !== FALSE)
{
if($inode != $finodes[$ekey])
{
//echo '?? Skip(same file name exists)'."\n";
$posts[] = array($inode,$file,$t);
continue;
}
}
}
$renamed[$i] = $t;
preview_dorename($preview,$file,$t,&$renamed);
flush();
}
foreach($posts AS $arr)
{
list($inode,$file,$t) = $arr;
$ekey = array_search($t,$renamed);
if($ekey === FALSE) // file not exists
{
preview_dorename($preview,$file,$t,&$renamed);
continue;
}
printf('%-50s%s'."\n",$file,"XX Skip($t file name exists");
}
exit(0);
?>