Nesse artigo criaremos uma função em PHP que copia diretórios inteiros, e se o diretório não existir, é criado.

A função copiar_diretorio possui três parametros: $diretorio, o nome do diretório a ser copiado, $destino, o nome do diretório de destino e $ver_acao, que exibe cada ação da execução.

<?php
   function copiar_diretorio($diretorio, $destino, $ver_acao = false){
      if ($destino{strlen($destino) - 1} == '/'){
         $destino = substr($destino, 0, -1);
        }
      if (!is_dir($destino)){
         if ($ver_acao){
            echo "Criando diretorio {$destino}\n";
            }
         mkdir($destino, 0755);
      }
        
      $folder = opendir($diretorio);
        
      while ($item = readdir($folder)){
         if ($item == '.' || $item == '..'){
            continue;
            }
         if (is_dir("{$diretorio}/{$item}")){
            copy_dir("{$diretorio}/{$item}", "{$destino}/{$item}", $ver_acao);
         }else{
            if ($ver_acao){
               echo "Copiando {$item} para {$destino}"."\n";
            }
            copy("{$diretorio}/{$item}", "{$destino}/{$item}");
            }
      }
   }
?>

Exemplos de Uso

Crie um diretório chamado "diretorio1" e dentro dele coloque alguns arquivos (foto, textos, etc). Como exemplo eu coloquei os seguintes arquivos: "imagem.jpg", "documento word.docx" e "documento excel.xlsx". Com o código a seguir vamos duplicar esta pasta e a nova pasta ficara com o nome "diretorio2":

<?php
   copiar_diretorio('./diretorio1', './diretorio2/'); // copia o diretório inteiro 
?>

Agora copiaremos o conteudo da pasta "diretorio1" para o diretório de execução:

<?php    
   copiar_diretorio('./diretorio1', './'); // copia os arquivos do diretório para o diretório de execução
?>

O terceiro parâmetro ($ver_acao) exibe cada ação da execução e podemos ver em funcionamente passando como "true":

<?php    
   copiar_diretorio('./diretorio1', './diretorio2/', true);
    // Exibe as seguintes mensagens:
    // Criando diretorio ./diretorio2
    // Copiando documento excel.xlsx para ./diretorio2
    // Copiando documento word.docx para ./diretorio2
    // Copiando imagem.jpg para ./diretorio2 
?>