Massen-Kopieren und -Umbenennen in PHP

Wie ich letztens freudig erfahren habe, kann man mit PHP wunderbar die alten, angestaubten Batch- und Shell-Skripte ersetzen. Im Gegensatz zu den beschränkten Funktionen dieser Vehikel ist PHP ein wahres Funktionsmonster! 😀

Die erste Funktion, die ich direkt benötigt, war, die Dateien in einem Ordner in einen anderen Ordner zu kopieren und gleichzeitig die Dateien - einem Schema folgend - umzubenennen. Gesagt, getan:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<?php
  if (!function_exists("scandir")) {
    function scandir($dir) {
      $result = array();
     
      if (file_exists($dir) && is_dir($dir)) {
        $handle = @opendir($dir);
        if ($handle !== false) {
          do {
            $file = readdir($handle);
           
            if ($file !== false) {
              $result[] = $file;
            }
          } while ($file !== false);
          closedir($handle);
        }
      }
     
      return $result;
    }
  }

  if (count($argv) == 5) {
    $inputPath  = $argv[1];
    $outputPath = $argv[2];
    $inputExp   = $argv[3];
    $outputExp  = $argv[4];
   
    if ($inputPath[strlen($inputPath)-1] != "/") {
      $inputPath .= "/";
    }
    if ($outputPath[strlen($outputPath)-1] != "/") {
      $outputPath .= "/";
    }
   
    if (file_exists($inputPath) && is_dir($inputPath)) {
      // create output path
      $proceed = file_exists($outputPath) && is_dir($outputPath);
      if (!$proceed) {
        $proceed = mkdir($outputPath);
      }
     
      if ($proceed) {
        print("INPUT:  $inputPath\n");
        print("OUTPUT: $outputPath\n");
        print("\n");
     
        $folderContent = scandir($inputPath);
        foreach ($folderContent as $content_before) {
          if (!is_dir($content_before)) {
            $content_after = preg_replace("/$inputExp/iU", $outputExp, $content_before);
         
            if (copy($inputPath . $content_before, $outputPath . $content_after)) {
              print("SUCCESS: "$content_before" => "$content_after"\n");
            } else {
              print("FAILURE: "$content_before" => "$content_after"\n");
            }
          }
        }
      } else {
        print("Usage: php ./" . basename(__FILE__) . " [INPUT_PATH] [OUTPUT_PATH] [INPUT_REGEX] [OUTPUT_REGEX]");
        exit(1);
      }
    }
  } else {
    print("Usage: php ./" . basename(__FILE__) . " [INPUT_PATH] [OUTPUT_PATH] [INPUT_REGEX] [OUTPUT_REGEX]");
    exit(1);
  }
?>

Um dieses Script zu benutzen, muss man es über das Command-Line Interface aufrufen. Dabei erwartet das Script folgende Parameter:

1
[INPUT_PATH] [OUTPUT_PATH] [INPUT_REGEX] [OUTPUT_REGEX]

Die Parameter "INPUT_PATH" und "OUTPUT_PATH" sollten selbsterklärend sein: Sie geben die Quell- und Zielordner an. "INPUT_REGEX" und "OUTPUT_REGEX" sind hier wesentlich spannender! 😀
Mit ihnen kann der reguläre Ausdruck angegeben werden, auf dessen Basis die kopierte Datei umbenannt werden soll. Diese Ausdrücke werde im Hintergrund an einen "preg_replace()"-Aufruf übergeben. Wenn ihr also z.B. alle Dateien aus Ordner "./a" nach Ordner "./b" kopieren und dabei alle Bindestriche in den Dateinamen durch Unterstriche ersetzen wollt, müsst ihr einfach nur folgende Parameter verwenden:

1
"./a" "./b" "\-" "_"

Natürlich stehen euch noch wesentlich komplexere Ersetzungsmöglichkeiten zur Verfügung - diese sollte jeder nutzen können, der tiefer mit regulären Ausdrücken auskennt. 🙂

Zum Schluss noch etwas Rechtliches:
Der Autor dieses Programms haftet nicht für Schäden an Soft- oder Hardware oder Vermögensschäden, die durch das Benutzen des Programms entstehen, es sei denn, diese beruhen auf einem grob fahrlässigen oder vorsätzlichen Handeln des Autors, seiner Erfüllungsgehilfen oder seiner gesetzlichen Vertreter.
Reguläre Grüße, Kenny

Schreibe einen Kommentar

Um Ihnen beim weiteren Kommentieren auf dieser Webseite die erneute Eingabe Ihrer Daten zu ersparen, wird beim Absenden Ihres Kommentars ein Cookie an Ihren Browser gesendet und von diesem gespeichert. Mit dem Absenden eines Kommentars auf dieser Webseite stimmen Sie der Speicherung und Übertragung dieses Cookies explizit zu.

Pflichtfelder sind mit * markiert.