Added missing exclusion flags
Put them into class
This commit is contained in:
parent
541b71e9ac
commit
ecf187ffb6
@ -12,215 +12,248 @@ if ( !$argv[1] )
|
|||||||
-s <str ...> Strings that will replace the matches
|
-s <str ...> Strings that will replace the matches
|
||||||
|
|
||||||
Optional:
|
Optional:
|
||||||
*-e <patterns> Exclude defined pattern
|
-e <patterns> Exclude defined pattern
|
||||||
*-l <File> Output log file
|
-l <File> Output log file
|
||||||
-t Test without modifying anything
|
-t Test without modifying anything
|
||||||
|
|
||||||
*Not available yet.
|
|
||||||
|
|
||||||
" ) ;
|
" ) ;
|
||||||
|
|
||||||
//------- End Usage -----------
|
//------- End Usage -----------
|
||||||
|
|
||||||
|
|
||||||
|
class ArgvParser
|
||||||
|
{
|
||||||
|
//parseOptions utilitiese by tgckpg
|
||||||
|
static function PARSE ( $argStream, $handler ) {
|
||||||
|
//Chop first useless argument -- argv[0]
|
||||||
|
array_shift ( $argStream ) ;
|
||||||
|
//Initiate ArrayObject for iterator
|
||||||
|
$arrayobject = new ArrayObject ( $argStream ) ;
|
||||||
|
//Initiate iterator for iteration
|
||||||
|
$iterator = $arrayobject->getIterator();
|
||||||
|
|
||||||
|
//If options is set first
|
||||||
//Define globals
|
if( $iterator->valid() && preg_match ( '/^-\w$/', $iterator->current() ) ) {
|
||||||
$test = false;
|
//iterate through whole argument stream
|
||||||
$recursive = false;
|
for ( ; $iterator->valid(); $iterator->next() ) {
|
||||||
$searchDirs = array();
|
//Check if reached next option
|
||||||
$patterns = array();
|
if( preg_match ( '/^-\w$/', $opts = $iterator->current() ) ) {
|
||||||
$replaceStrs = array();
|
//Get current options
|
||||||
|
$currOpt = $opts;
|
||||||
//------- Main Functions --------
|
//echo "$currOpt\n";
|
||||||
function getDirName ( $dir ) {
|
//Test if next stream is an option
|
||||||
return is_dir ( $dir ) ? $dir : dirname ( $dir ) ;
|
for ( $iterator->next(); $iterator->valid(); $iterator->next() ) {
|
||||||
}
|
if ( preg_match ( '/^-\w$/', $opts = $iterator->current() ) ) {
|
||||||
|
//echo "$currOpt $opts\n";
|
||||||
function getFileList ( $dir ) {
|
$handler($currOpt);
|
||||||
$fileList = array();
|
$currOpt = $opts;
|
||||||
$iterator = new DirectoryIterator ( getDirName ( $dir ) ) ;
|
} else break;
|
||||||
foreach ( $iterator as $fileinfo ) {
|
//var_dump($iterator->valid());
|
||||||
if ( $fileinfo->isFile() ) {
|
}
|
||||||
$fileList[] = $dir."/".$fileinfo->getFilename();
|
}//End if
|
||||||
}
|
//echo "$currOpt $opts\n";
|
||||||
|
$handler($currOpt, $opts);
|
||||||
|
//A temporary fix for infinite loop
|
||||||
|
if(!$iterator->valid())
|
||||||
|
break;
|
||||||
|
}// End for
|
||||||
|
//If option is not set first.
|
||||||
|
} else {
|
||||||
|
//Try other approach.
|
||||||
|
}// End if
|
||||||
}
|
}
|
||||||
return $fileList;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function getDirList ( $dir ) {
|
|
||||||
$dirList = array();
|
class RegRename
|
||||||
$iterator = new DirectoryIterator ( getDirName ( $dir ) ) ;
|
{
|
||||||
foreach ( $iterator as $fileinfo ) {
|
|
||||||
if ( $fileinfo->isDir() && !$fileinfo->isDot()) {
|
//Define globals
|
||||||
$dirList[] = $fileinfo->getFilename();
|
private $test = false;
|
||||||
|
private $recursive = false;
|
||||||
|
private $searchDirs = array();
|
||||||
|
private $patterns = array();
|
||||||
|
private $replaceStrs = array();
|
||||||
|
private $excludes = array();
|
||||||
|
|
||||||
|
private $logfile = NULL;
|
||||||
|
|
||||||
|
public function begin()
|
||||||
|
{
|
||||||
|
$this->validateOptions();
|
||||||
|
|
||||||
|
//------- Begin Operations -------
|
||||||
|
foreach ( $this->searchDirs as $dir ) {
|
||||||
|
$this->elog("Directory: $dir\nBuilding file list ...");
|
||||||
|
if ( $this->recursive ) {
|
||||||
|
$fileList = $this->getWholeFileList($dir);
|
||||||
|
} else {
|
||||||
|
$fileList = $this->getFileList($dir);
|
||||||
}
|
}
|
||||||
}
|
$this->elog("Searching ...");
|
||||||
|
foreach ( $fileList as $file ) {
|
||||||
return $dirList;
|
//
|
||||||
}
|
// Get the file name
|
||||||
|
// RegExplained:
|
||||||
function getWholeDirList ( $dir ) {
|
// Example: /foo/bar/foobar.bar
|
||||||
$wholeDirList = array();
|
// $matches[0][0] is the whole string "/foo/bar/foobar.bar"
|
||||||
//getWholeDirList will stop untill getDirList return an empty array.
|
//
|
||||||
foreach ( getDirList ( $dir ) as $file ) {
|
// ^(.+?)
|
||||||
//Store found path
|
// This gets the file path "/foo/bar/" for $matches[1][0]
|
||||||
$wholeDirList[] = "$dir/$file";
|
//
|
||||||
//Method getWholeDirList will self-iterate if sub-directories exist.
|
// ([^\/\\\\]+)$
|
||||||
$wholeDirList = array_merge ( $wholeDirList, getWholeDirList ( "$dir/$file" ) ) ;
|
// This gets the file name "foobar.bar" for $matches[2][0]
|
||||||
}
|
//
|
||||||
return $wholeDirList;
|
preg_match_all('/^(.+?)([^\/\\\\]+)$/', $file, $matches );
|
||||||
}
|
$newName = $matches[2][0];
|
||||||
|
foreach ( $this->patterns as $key => $pattern ) {
|
||||||
function getWholeFileList ( $dir ) {
|
//Rename over the patterns
|
||||||
//Get the first level list.
|
$newName = preg_replace( $pattern, $this->replaceStrs[$key], $newName );
|
||||||
$wholeFileList = getFileList( $dir );
|
|
||||||
//getWholeDirList and search its files.
|
|
||||||
foreach ( getWholeDirList ( $dir ) as $dir ) {
|
|
||||||
$wholeFileList = array_merge ( $wholeFileList, getFileList ( $dir ) ) ;
|
|
||||||
}
|
|
||||||
return $wholeFileList;
|
|
||||||
}
|
|
||||||
|
|
||||||
function validateOptions ( ) {
|
|
||||||
global $searchDirs, $patterns, $replaceStrs;
|
|
||||||
|
|
||||||
try {
|
|
||||||
if(count($searchDirs) == 0)
|
|
||||||
throw new Exception("Search directory is missing");
|
|
||||||
else if(count($patterns) == 0)
|
|
||||||
throw new Exception("Search pattern is missing");
|
|
||||||
else if(count($replaceStrs) == 0)
|
|
||||||
throw new Exception("Replacement string is missing");
|
|
||||||
else if(count($replaceStrs) != count($patterns))
|
|
||||||
throw new Exception("Replacement string and pattern count not match");
|
|
||||||
} catch(Exception $e) {
|
|
||||||
var_dump( $GLOBALS );
|
|
||||||
die("Error: $e.\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function setOptions( $item, $value = NULL ) {
|
|
||||||
global $test, $recursive, $searchDirs, $patterns, $replaceStrs;
|
|
||||||
switch($item) {
|
|
||||||
case "-d":
|
|
||||||
if($value)
|
|
||||||
$searchDirs[] = $value;
|
|
||||||
break;
|
|
||||||
case "-p":
|
|
||||||
if($value)
|
|
||||||
$patterns[] = $value;
|
|
||||||
break;
|
|
||||||
case "-r":
|
|
||||||
$recursive = true;
|
|
||||||
break;
|
|
||||||
case "-s":
|
|
||||||
if($value)
|
|
||||||
$replaceStrs[] = $value;
|
|
||||||
break;
|
|
||||||
case "-t":
|
|
||||||
$test = true;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
//Do nothing
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//parseOptions utilitiese by tgckpg
|
|
||||||
function parseOptions ( $argStream, $handler ) {
|
|
||||||
//Chop first useless argument -- argv[0]
|
|
||||||
array_shift ( $argStream ) ;
|
|
||||||
//Initiate ArrayObject for iterator
|
|
||||||
$arrayobject = new ArrayObject ( $argStream ) ;
|
|
||||||
//Initiate iterator for iteration
|
|
||||||
$iterator = $arrayobject->getIterator();
|
|
||||||
|
|
||||||
//If options is set first
|
|
||||||
if( $iterator->valid() && preg_match ( '/^-\w$/', $iterator->current() ) ) {
|
|
||||||
//iterate through whole argument stream
|
|
||||||
for ( ; $iterator->valid(); $iterator->next() ) {
|
|
||||||
//Check if reached next option
|
|
||||||
if( preg_match ( '/^-\w$/', $opts = $iterator->current() ) ) {
|
|
||||||
//Get current options
|
|
||||||
$currOpt = $opts;
|
|
||||||
//echo "$currOpt\n";
|
|
||||||
//Test if next stream is an option
|
|
||||||
for ( $iterator->next(); $iterator->valid(); $iterator->next() ) {
|
|
||||||
if ( preg_match ( '/^-\w$/', $opts = $iterator->current() ) ) {
|
|
||||||
//echo "$currOpt $opts\n";
|
|
||||||
$handler($currOpt);
|
|
||||||
$currOpt = $opts;
|
|
||||||
} else break;
|
|
||||||
//var_dump($iterator->valid());
|
|
||||||
}
|
}
|
||||||
}//End if
|
|
||||||
//echo "$currOpt $opts\n";
|
if( $matches[2][0] != $newName ) {
|
||||||
$handler($currOpt, $opts);
|
|
||||||
//A temporary fix for infinite loop
|
// Excluede any matches
|
||||||
if(!$iterator->valid())
|
foreach ( $this->excludes as $key => $pattern ) {
|
||||||
|
if(preg_match_all($pattern, $file)) {
|
||||||
|
$this->elog("S File \"{$matches[2][0]}\" excluded on $pattern");
|
||||||
|
continue 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( $this->test ) {
|
||||||
|
$this->elog("R File \"{$matches[2][0]}\" will be renamed to \"$newName\"");
|
||||||
|
} else {
|
||||||
|
rename ( $file, "{$matches[1][0]}$newName" );
|
||||||
|
}
|
||||||
|
if ( $this->logfile ) {
|
||||||
|
file_put_contents($this->logfile, $this->log);
|
||||||
|
}
|
||||||
|
}/* else {
|
||||||
|
echo "File \"{$matches[0][0]}\" will not be renamed\n";
|
||||||
|
}
|
||||||
|
//*/
|
||||||
|
}
|
||||||
|
$this->elog();
|
||||||
|
}
|
||||||
|
if ( $this->test ) $this->elog("*** Test enabled ***\n");
|
||||||
|
//------- End Operations -------*/
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setOption( $item, $value = NULL ) {
|
||||||
|
switch($item) {
|
||||||
|
case "-d":
|
||||||
|
if($value)
|
||||||
|
$this->searchDirs[] = $value;
|
||||||
break;
|
break;
|
||||||
}// End for
|
case "-p":
|
||||||
//If option is not set first.
|
if($value)
|
||||||
} else {
|
$this->patterns[] = $value;
|
||||||
//Try other approach.
|
break;
|
||||||
}// End if
|
case "-r":
|
||||||
|
$this->recursive = true;
|
||||||
|
break;
|
||||||
|
case "-s":
|
||||||
|
if($value)
|
||||||
|
$this->replaceStrs[] = $value;
|
||||||
|
break;
|
||||||
|
case "-t":
|
||||||
|
$this->test = true;
|
||||||
|
break;
|
||||||
|
case "-e":
|
||||||
|
$this->excludes[] = $value;
|
||||||
|
break;
|
||||||
|
case "-l":
|
||||||
|
$this->logfile = $value;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
//Do nothing
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//------- Main Functions --------
|
||||||
|
|
||||||
|
function elog( $line = "" ) {
|
||||||
|
$this->log .= $line;
|
||||||
|
$this->log .= "\n";
|
||||||
|
echo "$line\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function getDirName ( $dir ) {
|
||||||
|
return is_dir ( $dir ) ? $dir : dirname ( $dir ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getFileList ( $dir ) {
|
||||||
|
$fileList = array();
|
||||||
|
$iterator = new DirectoryIterator ( $this->getDirName ( $dir ) ) ;
|
||||||
|
foreach ( $iterator as $fileinfo ) {
|
||||||
|
if ( $fileinfo->isFile() ) {
|
||||||
|
$fileList[] = $dir."/".$fileinfo->getFilename();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $fileList;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getDirList ( $dir ) {
|
||||||
|
$dirList = array();
|
||||||
|
$iterator = new DirectoryIterator ( $this->getDirName ( $dir ) ) ;
|
||||||
|
foreach ( $iterator as $fileinfo ) {
|
||||||
|
if ( $fileinfo->isDir() && !$fileinfo->isDot()) {
|
||||||
|
$dirList[] = $fileinfo->getFilename();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $dirList;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getWholeDirList ( $dir ) {
|
||||||
|
$wholeDirList = array();
|
||||||
|
//getWholeDirList will stop untill getDirList return an empty array.
|
||||||
|
foreach ( $this->getDirList ( $dir ) as $file ) {
|
||||||
|
//Store found path
|
||||||
|
$wholeDirList[] = "$dir/$file";
|
||||||
|
//Method getWholeDirList will self-iterate if sub-directories exist.
|
||||||
|
$wholeDirList = array_merge ( $wholeDirList, $this->getWholeDirList ( "$dir/$file" ) ) ;
|
||||||
|
}
|
||||||
|
return $wholeDirList;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getWholeFileList ( $dir ) {
|
||||||
|
//Get the first level list.
|
||||||
|
$wholeFileList = $this->getFileList( $dir );
|
||||||
|
//getWholeDirList and search its files.
|
||||||
|
foreach ( $this->getWholeDirList ( $dir ) as $dir ) {
|
||||||
|
$wholeFileList = array_merge ( $wholeFileList, $this->getFileList ( $dir ) ) ;
|
||||||
|
}
|
||||||
|
return $wholeFileList;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function validateOptions ( ) {
|
||||||
|
try {
|
||||||
|
if(count($this->searchDirs) == 0)
|
||||||
|
throw new Exception("Search directory is missing");
|
||||||
|
else if(count($this->patterns) == 0)
|
||||||
|
throw new Exception("Search pattern is missing");
|
||||||
|
else if(count($this->replaceStrs) == 0)
|
||||||
|
throw new Exception("Replacement string is missing");
|
||||||
|
else if(count($this->replaceStrs) != count($this->patterns))
|
||||||
|
throw new Exception("Replacement string and pattern count not match");
|
||||||
|
} catch(Exception $e) {
|
||||||
|
var_dump( $GLOBALS );
|
||||||
|
die("Error: $e.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//------- End Main Functions --------
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//------- End Main Functions --------
|
|
||||||
|
|
||||||
|
|
||||||
parseOptions ( $argv, 'setOptions' ) ;
|
|
||||||
validateOptions();
|
|
||||||
|
|
||||||
|
|
||||||
//------- Begin Operations -------
|
|
||||||
foreach ( $searchDirs as $dir ) {
|
|
||||||
echo "Directory: $dir\nBuilding file list ...\n";
|
|
||||||
if ( $recursive ) {
|
|
||||||
$fileList = getWholeFileList($dir);
|
|
||||||
} else {
|
|
||||||
$fileList = getFileList($dir);
|
|
||||||
}
|
|
||||||
echo "Searching ...\n";
|
|
||||||
foreach ( $fileList as $file ) {
|
|
||||||
//
|
|
||||||
// Get the file name
|
|
||||||
// RegExplained:
|
|
||||||
// Example: /foo/bar/foobar.bar
|
|
||||||
// $matches[0][0] is the whole string "/foo/bar/foobar.bar"
|
|
||||||
//
|
|
||||||
// ^(.+?)
|
|
||||||
// This gets the file path "/foo/bar/" for $matches[1][0]
|
|
||||||
//
|
|
||||||
// ([^\/\\\\]+)$
|
|
||||||
// This gets the file name "foobar.bar" for $matches[2][0]
|
|
||||||
//
|
|
||||||
preg_match_all('/^(.+?)([^\/\\\\]+)$/', $file, $matches );
|
|
||||||
$newName = $matches[2][0];
|
|
||||||
foreach ( $patterns as $key => $pattern ) {
|
|
||||||
//Rename over the patterns
|
|
||||||
$newName = preg_replace( $pattern, $replaceStrs[$key], $newName );
|
|
||||||
}
|
|
||||||
if( $matches[2][0] != $newName ) {
|
|
||||||
if( $test ) {
|
|
||||||
echo "File \"{$matches[2][0]}\" will be renamed to \"$newName\"\n";
|
|
||||||
} else {
|
|
||||||
rename ( $file, "{$matches[1][0]}$newName" );
|
|
||||||
}
|
|
||||||
if ( $logfile ) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}/* else {
|
|
||||||
echo "File \"{$matches[0][0]}\" will not be renamed\n";
|
|
||||||
}
|
|
||||||
//*/
|
|
||||||
}
|
|
||||||
echo "\n";
|
|
||||||
}
|
|
||||||
if ( $test ) echo "*** Test enabled ***\n\n";
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//------- End Operations -------*/
|
$rrgr = new RegRename();
|
||||||
|
ArgvParser::PARSE ( $argv, array($rrgr, 'setOption') ) ;
|
||||||
|
$rrgr->begin();
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
Loading…
Reference in New Issue
Block a user