PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verzeichnisse / Dateien umbenennen


Marilu
20.11.2003, 15:59:03
Hi *.*,

diesmal suche ich eine Routine, mit der ich Verzeichnisse, Unterverzeichnisse und Dateien (also einen ganzen Verzeichnisbaum) browserkonform umbenennen kann, also Umlaute und ß ersetzen, Blanks durch _ , evtl. Groß- durch Kleinbuchstaben (nicht ganz so wichtig), so dass ich nur noch "saubere" Zeichen habe.

Hat jemand schon mal so was gemacht (ich möchte das Rad nicht neu erfinden)?

Greetz, Marilu

c4
20.11.2003, 16:43:47
Lokal kannst Du es sehr gut damit erledigen: http://www.fauland.com/af5.htm

Marilu
21.11.2003, 08:44:45
@ c4

Wenn ich es richtig sehe, kann ich damit nur einzelne Dateien - keine Verzeichnisse und Dateien darin - umbenennen.

Ich suche eine Routine, die ein eingestelltes Startverzeichnis - wenn möglich, nicht auf dem Webserver, sondern im File-System - nach meinen Vorgaben umbenennt, rekursiv durchsucht und alle Unterverzeichnisse und Dateien darin ebenfalls umbenennt (Hört sich kompliziert an).

Nev
21.11.2003, 10:43:16
Hi @ll

Ich hab da mal was nettes geschrieben:


Mit dieser Funktion kannst du es sehr leicht realisieren.
Mit dem Suchpater kannst du genau diese Files und Ordner suchen.
Du musst das Array verkehrt abarbeiten!!!
Da du sonst Probleme mit den schon umbenannten Verzeichnissen haben kannst.


<?
$path_todo = getcwd();
$path_array = array();
$todo_search = "#(.+).[jpg|gif|png|jpeg]#";
read_dir("path_array", $path_todo, $todo_search);
sort ($path_array);
Foreach ($path_array AS $key => $val) {
# Hier die Rotine die die Files umbennet
}


function read_dir ($array, $path, $search_ext = "", $sub_dir = false) {
global $$array, $Sys_Root_Absolute;

$dir_path = dir($path);
while($dir_entry = $dir_path->read()) {
$dir_type = filetype($path."/".$dir_entry);
if ($dir_type == "dir" && $sub_dir) {
if ($dir_entry != "." && $dir_entry != "..") {
read_dir ($$array, "$path$dir_entry/", $search_ext, $sub_dir);
}
}else{
if (strlen($search_ext)) {
if (preg_match($search_ext, $dir_entry)) {
// file-gefunden
array_push($$array, array($path,$dir_entry));
}
} else {
if ($dir_entry != "." && $dir_entry != "..") {
array_push($$array, array($path,$dir_entry));
}
}
}
}
$dir_path->close();
}
?>
die Funktion: read_dir hat folgende Parameter:
$array, $path, $search_ext = "", $sub_dir = false
$array ... gibt an in welches Array gespeichert werden soll in diesem Fall ... $path_array
$path ... gibt den Pfad an in dem er suchen soll in dem Fall ... das aktuelle Verzeichnis
$search_ext ... nach was soll gesucht werden. Hier wird ein Rex verwendet OPTIONAL default finde alles in diesem Fall sucht er nach jpg, jpeg, gif und png
$sub_dir ... gibt an ob auch in untergeordneten Verzeichnisen gesucht werden OPTIONAL default NEIN

Nev
24.11.2003, 14:23:37
Hi @gain

erster Fehler:
Du musst den Pfad Unix-Komform angeben
d.h.: statt / verwenden.

2tens in meinen Script war ein Fehler:
read_dir ($$array, "$path$dir_entry/", $search_ext, $sub_dir);
ersetze sie mit
read_dir ($array, "$path$dir_entry/", $search_ext, ture);

Habs bei mir ausprobiert und es funkt.
wobei ich die Ausgabe anderes gemacht habe:
Foreach ($path_array AS $key => $val) {
# Hier die Rotine die die Files umbennet
Echo "$key => $val || ".$val[0]." || ".$val[1]." || ".$val[2]."<br> ";

}

Marilu
24.11.2003, 14:57:02
@ Nev

> Du musst den Pfad Unix-Komform angeben

Ja, das war der Fehler.

> wobei ich die Ausgabe anderes gemacht habe:

Deine Version sieht natürlich schöner aus... Jetzt muß ich bloß noch hinkriegen, dass nach der Namensänderung die Verzeichnis- und Dateinamen zurückgeschrieben werden. Oder hast Du da auch schon was in der Schublade?

Thx, Marilu

Nev
24.11.2003, 15:06:04
@Marilu

So auf die schnelle ned!

Überlege mir was

Marilu
24.11.2003, 15:58:25
@ Nev

ich bin schon ein Stück weiter... umbenennen von Dateien haut hin. Noch eine Frage: wie kann ich in das von Deiner Funktion erzeugte Array einen Eintrag integrieren, in dem bei einem Verzeichniswechsel (bzw. beim Start) _nur_ der Verzeichnisname (ohne eine Datei) steht? Den benötige ich, um das Verzeichnis umzubenennen.

Greets, Marilu

Nev
24.11.2003, 16:09:49
So dala

Ich hab mich mal hingesetzt und ein kleines Script gebastelt das dir die ganze Arbeit abnimmt:
<?
$path_todo = "c:/offline_server/test/test/";
$path_array = array();
$todo_search = "#([äöüÄÖÜ |()])#";
$replace_array = array("ä" => "ae",
"Ä" => "ae",
"ö" => "oe",
"Ö" => "oe",
"ü" => "üe",
"Ü" => "üe",
" " => "_",
"|" => "_",
"(" => "_",
")" => "_"
);

read_dir("path_array", $path_todo, $todo_search);
rsort ($path_array);

Foreach ($path_array AS $key => $val) {
# Hier die Rotine die die Files umbennet
$new_name = str_replace(array_keys($replace_array), $replace_array, $val[1]);
rename ($val[0].$val[1], $val[0].$new_name);
}

function read_dir ($array, $path, $search_ext = "", $sub_dir = true) {
global $$array, $Sys_Root_Absolute;

$dir_path = dir($path);
while($dir_entry = $dir_path->read()) {
$dir_type = filetype($path."/".$dir_entry);
if ($dir_type == "dir") {
if (strlen($search_ext)) {
if (preg_match($search_ext, $dir_entry)) {
// Dir gefunden das passt
array_push($$array, array($path,$dir_entry));
}
} else {
if ($dir_entry != "." && $dir_entry != "..") {
// Alles nehmen
array_push($$array, array($path,$dir_entry));
}
}
if ($dir_entry != "." && $dir_entry != ".." && $sub_dir) {
read_dir ($array, "$path$dir_entry/", $search_ext, true);
}
}else{
if (strlen($search_ext)) {
if (preg_match($search_ext, $dir_entry)) {
// file-gefunden
array_push($$array, array($path,$dir_entry));
}
} else {
if ($dir_entry != "." && $dir_entry != "..") {
// Alles nehmen
array_push($$array, array($path,$dir_entry));
}
}
}
}
$dir_path->close();
}
?>

Wie funkt das Ding
Mittels dem Suchpatters sucht er nach Übereinstimmungen
folgende Zeichen sollen ja ned vorkommen:
äöüÄÖÜ |()

Falls dieses Suchmuster im Dateinamen oder im Verzeichnise vorkommt, wird es in das Array geschrieben.

Nach dem er alles durchgelaufen ist, beendet er die Funktion.

Jetzt wird das Array SORTIERT, ganz wichtig ist das R dabei!
Somit wird das Array umgekehrter Sortiert.
Wenn man das nicht macht, hast du das Problem das du zuerst das Verzeichnis änderst, und dann nicht mehr auf Dateien, die in dem Verzeichnis sind, zugreifen kannst.
Mit der umgekehrter sortierung, schreibt er zuerst die Datei um, und dann erst das Verzeichniss.

Nach dem Sortieren, wird das Array durchlaufen.
Wobei er den Namen des zum änderen Verzeichnis bzw. Datei durch Werte aus dem $replace_array ersetzt.
Danach wird die Datei/Verzeichnis umbenannt und er geht in der Schleife weiter.

Was musst du ändern:
Eigendlich nur den Pfad oben.

Wie ändere ich den Patter
$todo_search = "#([äöüÄÖÜ|() ])#";
Also alles was zwischen den [ ] steht, soll nicht enthalten sein.
Damit man dann einen sauberen Namen hat, sollte man es auch im $replace_array definieren.

Marilu
25.11.2003, 14:38:19
@ Nev

Super Sache, die Du da gebaut hast. Genau das, was ich brauche. Vielen Dank.

Greetz, Marilu

Nev
25.11.2003, 14:50:04
NP