PHP: Dateien und Ordner rekursive Umbenennen

Ein altbekanntes Problem der deutschen Sprache im Zusammenhang mit Linux-Dateinamen: Ich habe von meinem Windows System Dateien per FTP hochgeladen und die eingekaufte PHP Anwendung kann nicht richtig mit den Umlauten im Dateinamen umgehen (oder anderen Sonderzeichen, welche Windows im Dateinamen erlaubt). Also lass ich per PHP Script einen ganzen Verzeichnisbaum rekursive durchgehen und alle Umlaute/Sonderzeichen umwandeln. Das geht mit folgendem Snippet:

<?php
  
// Directory to scan (Full System Path)
  
$dir './';
  
  function 
cleanName($name)
  {
      
$name str_replace('ä''ae'$name);
      
$name str_replace('ö''oe'$name);
      
$name str_replace('ü''ue'$name);
      
$name str_replace('Ä''Ae'$name);
      
$name str_replace('Ö''Oe'$name);
      
$name str_replace('Ü''Ue'$name);
      return 
$name;
  }
  
  function 
getDirectory($path '.'$ignore '')
  {
      
$dirTree = array();
      
$dirTreeTemp = array();
      
$ignore[] = '.';
      
$ignore[] = '..';
      
      
$dh = @opendir($path);
      
      while (
false !== ($file readdir($dh))) {
          if (!
in_array($file$ignore)) {
              if (!
is_dir("$path/$file")) {
                  
$dirTree["$path"][] = $file;
              } else {
                  
$dirTree["$path"] = array();
                  
$dirTreeTemp getDirectory("$path/$file"$ignore);
                  if (
is_array($dirTreeTemp))
                      
$dirTree array_merge($dirTree$dirTreeTemp);
              }
          }
      }
      
closedir($dh);
      return 
$dirTree;
  }
  
// Get all Files and Folders in an Array
  
$dirTree getDirectory($dir$ignore);
  
$folders = array();
  foreach (
$dirTree as $path => $files) {
      foreach (
$files as $name) {
          if (
preg_match('/[äöüÄÖÜ]/'$name)) {
              echo 
'rename(' $path '/' $name ', ' cleanName($name) . ');<br></br>';
              
rename($path '/' $name$path '/' cleanName($name));
          }
      }
      
$folders[substr_count($path'/')][] = $path;
  }
  
// Sortiert Ordner nach "Tiefe"
  
krsort($folders);
  
  
// Benennt alle Ordner mit Umlauten um
  
foreach ($folders as $paths_by_debth) {
      foreach (
$paths_by_debth as $path) {
          
$pos strrpos($path'/');
          
$folder substr($path$pos);
          if (
preg_match('/[äöüÄÖÜ]/'$folder)) {
              echo 
'rename(' $path ',' substr($path0$pos) . cleanName($folder) . ');<br></br>';
              
rename($pathsubstr($name0$pos) . cleanName($folder));
          }
      }
  }
?> 
<pre> 
   <?php
  
// Gibt den ganzen Ordner Baum aus
  //print_r($dirTree); 
  ?> 
</pre>

Das Programm wurde absichtlich ausführlich geschrieben, um die Einzelnen Schritte klar und verständlich darzustellen. Natürlich könnte man das ganze auch abgekürzter schreiben. Die Funktion cleanName kann beliebig erweitert werden. Hier könnte man auch via preg_replace bestimmte Dateinamen nach einem Muster umbenennen.

Danke für das Script. Hab es

Danke für das Script.
Hab es ein bisschen modifiziert.

echo 'rename(' . $path . ',' . substr($path, 0, $pos) . cleanName($folder) . ');';
rename($path, substr($name, 0, $pos) . cleanName($folder));

da ist noch ein kleienr Fehler drin.

beim 2. rename muss $path hin oder?

Danke für den tollen beitrag

Danke für den tollen beitrag

Kommentar hinzufügen

Der Inhalt dieses Feldes wird nicht öffentlich zugänglich angezeigt.
  • Internet- und E-Mail-Adressen werden automatisch umgewandelt.
  • Zulässige HTML-Tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <php>
  • Zeilen und Absätze werden automatisch erzeugt.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>, <drupal>, <js>, <php>, <vb>. PHP-Quellcode kann in <?php ... ?> or <% ... %> eingeschlossen werden.
  • Verlinkte Bilder mit dem 'rel="lightbox"' in <a> Tags wird die Lighbox aufrufen, wenn darauf geklickt wurde.

Weitere Informationen über Formatierungsoptionen

Mit dem Absenden dieses Formulars, akzeptieren Sie die Datenschutzrichtlinie von Mollom.