Newsgroup: it.comp.www.php
Titolo: Espressione regolare - rename

Devo rinominare un gruppo di file con un solo comando.
X esempio:
pippo-a.b
pippo-c.d
in:
pluto-a.b
pluto-c.d
Uso il seguente comando:
$old = "pippo";
$new = "pluto";
@exec("rename 's/$old/$new/' dirpath/*");
Fin qui tutto bene, il problema sorge quando il nome nuovo contiene il 
prefisso di quello vecchio.
X esempio non funziona quando ho:
$old = "pippo";
$new = "pippone";
In questo caso non rinomina un bel niente!!
La cosa è alquanto strana siccome questo problema l'ho solo col php siccome 
da riga di comando funziona, cosa dovrei fare?
grazie
-- 
Using M2, Opera's revolutionary e-mail client: 
http://www.opera.com/m2/

 $new = "pippone";
Mmmm non saprei. Però perchè usi un comando dalla shell? C'è rename() che
potrebbe fare al caso tuo, magari risolvi anche quel problema.
http://www.php.it/manual/it/function.rename.php
Deep

 potrebbe fare al caso tuo, magari risolvi anche quel problema.
Perchè la funzione rename() mi permette di rinominare un solo file, invece 
io devo rinominare un intero insieme di file.
-- 
Using M2, Opera's revolutionary e-mail client: 
http://www.opera.com/m2/
** Articolo inviato tramite i servizi gratuiti di 
www.x-privat.org
 **

 io devo rinominare un intero insieme di file.
Sei sicuro ?
Usando un loop ne puoi modificare quanti ne vuoi
guarda questa comoda  funzione
<?
 function change_filename_recursive($dir, $replaced_key='', $new_key=''){
   if ($subhandle = @opendir("$dir")) { /*apre una directory*/
     while (false !== ($file = readdir($subhandle))) { /*elenca in nomi dei
file*/
       if (!is_dir($file)){ /*ignora le cartelle*/
         if (ereg("$replaced_key", $file)){/*cerca i file che contegono la
parola da sostituire*/
 $replaced_fileName = ereg_replace ("$replaced_key","$new_key", $file);
/*scrive il nuovo nome*/
 @rename("$dir/$file", "$dir/$replaced_fileName");/*rename*/
 }}}}}/////END
?>
Chiamata alla funzione
change_filename_recursive("Cartella", "pippo", "pippone");
Ciao

 guarda questa comoda  funzione
Grazie mille non mi era venuta in mente la funzione ereg_replace(), xò c'è 
un piccolo problema in questo loop, spesso (non sempre) mi rinomina due 
volte il primo file prima di uscire.
Avendo i file:
pippo.a
pippo.b
Mi ritrovo con:
pipponene.a
pippone.c
Prima della chiamata a @rename ho messo:
echo "$replaced_key - $new_key - $file - $replaced_fileName<br>";
E mi restituisce:
pippo - pippone - pippo.a - pippone.a
pippo - pippone - pippo.b - pippone.b
pippo - pippone - pippone.a - pipponene.a
Non capisco come mai non mi esce subito dal ciclo?


 pippo - pippone - pippone.a - pipponene.a
Secondo logica il risultato è giusto, anche se non è quello che speravi
pippo viene sostituito con pippone, quindi se hai un file con già il nome
pippone gli viene sostituita la prima parte cioe' pippo in pippone, ecco
il risultato falso, non avevo pensato a questo quando ho scritto la funzione
basta aggiungere un' altro ereg al codice e vedrai che funziona a dovere


Infatti la logica è gista è il ciclo while che è sbagliato, infatti io 
nella mia cartella ho solo i files:
pippo.a
pippo.b
Invece lui me ne legge tre, prima i due esistenti poi il primo files che è 
già stato rinominato e lo rinomina una seconda volta.


A me non da nessun errore!
la causa forse è solo a livello di visualizzazione, hai controllato
i nomi dei file, hai fatto per caso un refresh con il browser ?
cmq ho aggiunto un ulteriore ciclo if di controllo per evitare
gli errori a causa dei refresh ,
spero ti sono stato d' auito¨
Ciao
Jeey
 // ver 1.2
  function change_filename_recursive($dir, $replaced_key='', $new_key=''){
if ($subhandle = @opendir("$dir")) { /*apre una directory*/
while (false !== ($file = readdir($subhandle))) { /*elenca in nomi dei
file*/
 if (!is_dir($file)){ /*ignora le cartelle*/
 if (!ereg("$new_key", $file) || ereg ("$new_key", $replaced_key)){
/*ignora i file dove nel nome esiste già la new_key,
 ma non dove la  variabile replaced_key contiene new_key nella propria
stringa
*/
if (ereg("$replaced_key", $file)){/*cerca i file che contegono la parola da
sostituire*/
 $replaced_fileName = ereg_replace ("$replaced_key","$new_key", $file);
/*scrive il nuovo nome*/
 @rename("$dir/$file", "$dir/$replaced_fileName");/*rename*/
 $c++;
$print .= "<pre>
             QUESTO FILE È STATO RINOMINATO
               $replaced_key
               $new_key
               $file
               $replaced_fileName
</pre>";
}}}}//end while
}if($c==true){
return  "$c file sono stati rinominati<br>$print";}
else{return "Nessun file è stato rinominato";}
}

 spero ti sono stato d' auito¨
Non faccio nessun refresh e i nomi erano sbagliati anche nel filesystem.
Non so spiegarmi cosa ci sia che non va nel ciclo.
Comunqu adesso con l'aggionta dell'if per controllare i file già rinominati 
funziona, grazie.
ciao
