rename_recursive
Gepost door Sjaak Ringens op 27-07-2011 02:06.
Ik heb deze functie gemaakt omdat ik een map (met submappen) met zeker 5000+ foto's moest gaan hernoemen zodat elke foto een unieke naam heeft (in dezelfde map) en dit natuurlijk erg lang gaat duren als ik dit handmatig moet gaan doen!
De bestanden worden hernoemd met de willekeurige karakters [a-z0-9].
Om het script toch wat bruikbaarder te maken heb ik extra functies toegevoegd:
Functies
- Je kunt aangeven uit hoeveel karakters het nieuwe bestand moet bestaan (max 128).
- Je kunt aangeven welke bestanden niet hernoemd mogen worden.
- Je kunt aangeven welke bestandstypes niet hernoemd mogen worden.
- Je kunt aangeven of bestanden met het juiste formaat overgeslagen mogen worden, of
geforceerd nog eens hernoemen.
- Je kunt aangeven of de bestanden in onderliggende mappen ook hernoemd moeten worden.
Let op
Je hebt minimaal PHP versie 5.3 nodig voor deze functie.
Bestanden van dit script
rename_recursive.php
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | <?php
ini_set( 'display_errors', 'On' );
error_reporting( E_ALL | E_STRICT );
/***
* In welke map staan de bestanden?
* hier = map waar dit bestand in staat.
*/
$sFolder = dirname( __FILE__ );
/***
* Hoe lang moeten de nieuwe unieke bestandsnamen worden?
* maximumlengte voor deze functie is 128 tekens
*/
$iFileNameLength = 8;
/***
* Moeten ook de bestanden uit onderliggende mappen worden hernoemd?
* true = ja
* false = nee
*/
$bIncludeSubFolders = true;
/***
* Alle bestanden hernoemen, ook al zijn ze in het goede formaat?
* true = ja
* false = nee
*/
$bForceRename = false;
/***
* Hier kun je opgeven welke bestanden NIET hernoemd moeten worden.
* Dit bestand hernoemen we natuurlijk niet, dus deze staat al erbij.
* Let op dat je hier de extensies van de bestanden ook neerzet!
*/
$aExcludedFileNames = array( basename( __FILE__ ), 'nog_een_bestand.txt' );
/***
* Hier kun je opgeven welke bestandsextensies NIET hernoemd moeten worden.
* php-bestanden gaan we nu even niet hernoemen, dus deze sluiten we alvast uit.
* Extensies zijn niet hoofdlettergevoelig.
*/
$aExcludedExtensions = array( 'php', 'nog_een_extensie' );
/**************************************************/
/*** Hieronder hoef je niets meer aan te passen ***/
/**************************************************/
set_time_limit( 0 );
function rename_recursive( $psFolder, $pbForceRename, $piFileNameLength, $paExcludedFileNames, $paExcludedExtensions, $pbIncludeSubFolders )
{
if( false === is_dir( $psFolder ) )
trigger_error( 'De opgegeven map is niet geldig' );
if( false === is_bool( $pbForceRename ) )
trigger_error( 'De tweede parameter ($pbForceRename) moet een boolean zijn' );
if( false === ctype_digit( (string)$piFileNameLength ) )
trigger_error( 'De derde parameter ($piFileNameLength) moet een integer zijn' );
if( false === is_array( $paExcludedFileNames ) )
trigger_error( 'De vierde parameter ($paExcludedFileNames) moet een array zijn' );
if( false === is_array( $paExcludedExtensions ) )
trigger_error( 'De vijfde parameter ($paExcludedExtensions) moet een array zijn' );
if( false === is_bool( $pbIncludeSubFolders ) )
trigger_error( 'De zesde parameter ($pbIncludeSubFolders) moet een boolean zijn' );
$oDirectoryIterator = new RecursiveDirectoryIterator( $psFolder );
foreach( $oDirectoryIterator as $sFileInfo )
{
if( true === is_dir( $sFileInfo ) )
if( true === $pbIncludeSubFolders )
rename_recursive( $sFileInfo, $pbForceRename, $piFileNameLength, $paExcludedFileNames, $paExcludedExtensions, $pbIncludeSubFolders );
else
{
$sFolder = substr( $sFileInfo, 0, strrpos( $sFileInfo, DIRECTORY_SEPARATOR ) );
$sOldFileName = strstr( substr( $sFileInfo, strrpos( $sFileInfo, DIRECTORY_SEPARATOR ) + 1 ), '.', true );
$sFileExtention = substr( $sFileInfo, strrpos( $sFileInfo, '.' ) + 1 );
if( true === in_array( $sOldFileName, $paExcludedFileNames ) )
continue;
if( true === in_array( strtolower( $sFileExtention ), array_map( 'strtolower', $paExcludedExtensions ) ) )
continue;
if( false === $pbForceRename && strlen( $sOldFileName ) === $piFileNameLength && true === ctype_alnum( $sOldFileName ) )
continue;
$sNewFileName = strtolower( substr( hash( 'sha512', microtime( ) ), rand( 0, ( 128 - $piFileNameLength ) ), $piFileNameLength ) . '.' . $sFileExtention );
while( true === is_file( $psFolder . DIRECTORY_SEPARATOR . $sNewFileName ) )
$sNewFileName = strtolower( substr( hash( 'sha512', microtime( ) ), rand( 0, ( 128 - $piFileNameLength ) ), $piFileNameLength ) . '.' . $sFileExtention );
echo $sFolder . DIRECTORY_SEPARATOR . $sOldFileName . '.' . $sFileExtention . ' => ' . $sFolder . DIRECTORY_SEPARATOR . $sNewFileName . PHP_EOL;
rename( $sFolder . DIRECTORY_SEPARATOR . $sOldFileName . '.' . $sFileExtention, $sFolder . DIRECTORY_SEPARATOR . $sNewFileName );
}
}
}
rename_recursive( $sFolder, $bForceRename, $iFileNameLength, $aExcludedFileNames, $aExcludedExtensions, $bIncludeSubFolders );
?> |


