c'est le principe utilisé.
la fonction liste d'abord la racine et la recopie à la nouvelle destination, elle rentre dans le 1er dossier, le liste et le recopie. S'il n'y a pas de sous dossier, elle ressort de la fonction, redescende d'un niveau, rentre dans le dossier suivant, ...
et à la fin si la copie s'est bien déroulée, elle refait le même chemin et supprime les fichiers et dossiers.
il existe peut-être une fonction toute faite ou qui utilise une fonction de l'OS, mais je n'en ai pas souvenir, il y a un peu trop longtemps que je n'ai pas codé en PHP. 