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($path, 0, $pos) . cleanName($folder) . ');<br></br>';
rename($path, substr($name, 0, $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