PHP Shellscript zum Umwandeln von Dateinamen in Kleinbuchst.

Bash, Shell, PHP, Python, Perl, CGI
cybersmog
Posts: 78
Joined: 2003-09-17 12:38
Location: Bayern

PHP Shellscript zum Umwandeln von Dateinamen in Kleinbuchst.

Post by cybersmog »

Hallo zusammen,

ich stand gestern vor der Aufgabe, eine größere Menge von Dateinamen in Kleinbuchstaben umzuwandeln. Da ich mit der Bash Programmierung noch nicht wirklich fit bin, habe ich mir ein Shell Script in PHP geschrieben, das auch wunderbar seinen Zweck erfüllt.
Jetzt würde mich aber trotzdem interessieren, ob und wie das mit einem Bash Script gegangen wäre.

Für diejenigen, die es interessiert, hab ich mal mein PHP Skript angehängt:

Code: Select all

#!/usr/local/bin/php
<?php
// +---------------------------------------------------------------------+
// | Konverter um Dateinamen in Kleinbuchstaben umzuwandeln              |
// +---------------------------------------------------------------------+
// | Alle Dateinamen im als Parameter angegebenen Verzeichnis werden in  |
// | Kleinbuchstaben umgewandelt. Wenn kein Parameter angegeben wird,    |
// | wird das aktuelle Verzeichnis genommen.                             |
// | Aufruf: convFileNameToLower.php [OPTIONEN]                          |
// +---------------------------------------------------------------------+

// PEAR Modul zur Verabeitung der Kommandozeilenparameter
require_once 'Console/Getopt.php';

/**
 * @return void
 * @desc Hilfetext ausgeben
*/
function usage() {
	echo "Verwendung: convFileNameToLower.php [OPTIONEN]...n";
    echo "Wandelt alle Dateinamen in Kleinbuchstaben um.nn";
    echo "  -h, --help             zeigt diese Hilfemeldungn";
    echo "      --dir=VERZEICHIS   zu bearbeitendes Verzeichnisn";
    echo "  -r                     wandelt auch Dateien in Unterordern umn";
    exit;
}

/**
 * @return void
 * @param string $dir
 * @param bool $r
 * @desc Konvertierung beginnen
*/
function convFileNameToLower($dir, $r) {
	global $numFiles, $numFilesSkipped;
	processDir($dir, $r);
	echo "nKonvertierungsprozess abgeschlossen!n";
	echo ($numFiles == 1) ? "Es wurde 1 Datei umbenannt.n" : "Es wurden $numFiles Dateien umbenannt.n";
	echo ($numFilesSkipped == 1) ? "Es wurde 1 Datei übersprungen.n" : "Es wurden $numFilesSkipped Dateien übersprungen.n";
}

/**
 * @return void
 * @param string $dir
 * @param bool $r
 * @desc Rekursive Funktion zum Dateiumbennen
*/
function processDir($dir, $r) {
	global $numFiles, $numFilesSkipped;
	$handle = opendir($dir);
	while ($file = readdir ($handle)) {
		if ($file != '.' && $file != '..') {
			// prüfen, ob Verzeichnis
			if (is_dir($file)) {
				// wenn Rekursion, Funktion neu aufrufen
				if ($r == true) {
					processDir($dir.'/'.$file, $r);
				}
				// sonst Skip Meldung
				else {
					echo "$dir/$file: Verzeichnis (wird übersprungen)n";
				}
			}
			else {
				// Datei umbennen
				$filenew = strtolower($file);
				if ($file == $filenew) {
					$numFilesSkipped++;
					echo "$dir/$file => übersprungenn";
				}
				else {
					$command = 'mv '.$dir.'/'.$file.' '.$dir.'/'.$filenew;
					exec($command);
					$numFiles++;
					echo "$dir/$file => $dir/$filenewn";
				}
			}
   		}
	}
	closedir($handle);
}

// Vorbelegung
$recursive = false;
$dir = getcwd();
$numFiles = 0;
$numFilesSkipped = 0;

// Komandozeilenparameter
$short_opts = "hr";
$long_opts = array('dir=', 'help');

// Parameter verarbeiten
$con =& new Console_Getopt();
$opts =& $con->readPHPArgv();
$prog = array_shift($opts);

$options =& $con->getopt($opts, $short_opts, $long_opts);
foreach ($options[0] as $option) {
	 switch ($option[0]) {
	 	case 'h':
	 	case '--help':
	 		usage($prog);
	 		break;
	 	case 'r':
	 		$recursive = true;
	 		break;
	 	case '--dir':
	 		$dir = $option[1];
	 		break;
	 }
}

// Prüfen, ob das Verzeichnis existiert
if (!is_dir($dir)) {
	echo "Fehler: $dir ist kein Verzeichnis!nn";
	exit;
}

// Ausgabe starten
echo "Folgendes Verzeichnis wird verarbeitet: $dirn";
echo "Verzeichnis rekursiv verarbeiten: ";
echo ($recursive == true) ? "jan" : "neinnn";
echo "Beginnen? [J/n] ";
$input = str_replace("n", "", fgets(STDIN, 100));
if (($input == 'J') || ($input == 'j') || ($input == '')) {
	convFileNameToLower($dir, $recursive);
}
else {
	echo "Der Konvertierungsprozess wurde abgebrochen!nn";
}
?>
captaincrunch
Userprojekt
Userprojekt
Posts: 7066
Joined: 2002-10-09 14:30
Location: Dorsten

Re: PHP Shellscript zum Umwandeln von Dateinamen in Kleinbuchst.

Post by captaincrunch »

Ein weiteres Beispiel dafür, warum PHP für mich eine Sprache zum Webseitenbasteln ist. Auf der Shell ist das ganze ein popeliger Einzeiler:

Code: Select all

for i in `ls TEST*`; do mv $i `echo $i | /usr/bin/tr -s '[:upper:]' '[:lower:]'`; done
...wobei das nur eine eben dahingerotze quick'n'dirty-Variante ist. ;)
DebianHowTo
echo "[q]sa[ln0=aln256%Pln256/snlbx]sb729901041524823122snlbxq"|dc
thorsten
Posts: 561
Joined: 2003-02-01 13:14
Location: Fuldatal

Re: PHP Shellscript zum Umwandeln von Dateinamen in Kleinbuchst.

Post by thorsten »

Es geht noch kürzer:

Code: Select all

mmv -p "*" "#l1"
Zu dem Thema GROÃ? nach kleinbuchstaben zeigt google massig Fundstellen an.
Ich weiß nicht, ob mmv mittlerweile die Umlaute berücksichtigt, das war früher nicht so.
Da habe ich mir mal folgendes aus der SuSEML gefischt:

Code: Select all

find PFAD -type f -name "*[^a-z]*" -print0  | xargs -0 -n1
  | perl -ne 'use locale; s/ /\ /; print; /^(.*)/([^/]+)$/;
            print "$1/",  lc($2);'
  | xargs -rn2 mv -i
letzteres Beispiel habe ich aber nicht getestet, da der mmv bei mir stets gute Dienste leistet :)