Alle Dateien eines Ordners umbennenen

T

tommyboy

Grünschnabel
Hallo Forum,

ich benutze einen Mac, allerdings möchte ich mir ein Shellskript basteln und habe allerdings keine Ahnung wie! Bin absolute neu in Unix!

Es sollte folgendes machen:

Eine Datei aus dem Ordner lesen, dann die Rechte so verbiegen, dass das Skript die Datei umbennenen kann. Wenn das Skript das darf, dann den alten Präfix durch 1 ersetzen. Bei der nächsten Datei das gleiche, nur der Präfix wird um eins erhöht. So sollten alle Dateien in dem Ordner umbenannt werden, egal ob die rechte nicht stimmen, weil Sie evtl. von Windoof kommen und egal wenn die Datei schon 1.doc heißt. Habe ein Tool aufm Mac, aber das geht bei 30000 einzelnen Dateien in die Knie! Und wenn die Rechte nit stimmen kann es einzelne Dateien nicht umbennenen, dass nervt.

Hat jemand sowas oder würde er mir beim basteln, aufrufen helfen?

Mfg
Tommyboy PS:Frohhes Weihnachten!
 
Lösung in PHP

Hallo,

das ist zwar jetzt kein Bash-Skript sondern ein PHP-Skript, aber es funktioniert.

PHP:
#!/usr/bin/php

<?php

$path = $argv[1];
$user = 'tommyboy';
$group = 'users';
$permissions = '755';
$prefix = '1_';

function get_username($uid) { // Hilfsfunktion um den Benutzernamen aus der uid zu generieren
	$username = posix_getpwuid($uid);
	return $username['name'];
}

if ($handle = opendir($path)) {
	while (false !== ($file = readdir($handle))) {
		if ($file != "." && $file != "..") {

			if(is_file($file) == true) { // Kontrolle ob aktueller Verzeichnisinhalt eine Datei ist

				if(get_username(fileowner($file)) != $user) {
					system('chown '.$user.':'.$group.' '.$file); //Eigentümer setzen, Benutze externen Befehl, um den PHP-SafeMode zu umgehen
				}
				system('chmod '.$permissions.' '.$file); // Zugriffsrechte setzen, Benutze externen Befehl, um den PHP-SafeMode zu umgehen
				$newfile = $prefix.$file;

				echo $file.' wird umbenannt in '.$newfile;
				rename($file, $newfile);
				if(is_file($newfile) == true) {
					echo 'Erfolgreich!'."\n";
				}
				else {
					$error[] = 'Beim Umbenennen von '.$file.' in '.$newfile.'trat ein Fehler auf';
				}
			}
		}
	}
	closedir($handle);
}

if(isset($error)) {
	echo "\n\n".'======================='."\n\n";
	foreach($error as $entry) {
		echo $entry."\n";
	}
}
else {
	echo "\n\n".'======================='."\n\n".'Alle Operationen erfolreich beendet. ';
}

?>

Funktionsweise:
Erwartet als Parameter das Verzeichnis, dessen Inhalte umbenannt werden sollen. Die Einstellungen für dein System kannst du im Kopf vornehmen.

Was hier jetzt nicht dabei ist, ist die Option eines rekursiven Durchlaufs, aber das kann man ja hineinbasteln.

Es muss natürlich mit Rechten gestartet werden, die ein Ändern des Benutzers erlauben und ob und wie PHP auf dem Mac arbeitet, bzw. wo die Executable liegt weiß ich auch nicht.

Wie stabil das bei 30000 Dateien ist kann ich natürlich nicht sagen. Wahrscheinlich nicht sehr stabil...
 
Wie stabil das bei 30000 Dateien ist kann ich natürlich nicht sagen. Wahrscheinlich nicht sehr stabil...

instabil wird es nicht werden denke ich, aber es wird wohl die maximale skriptlaufzeit des webservers sprengen?
 
Das ist ein Skript für die Kommandozeile. Das läuft nicht auf einem Webserver. Das sieht man auch am Shebang :-)
 
Hallo ich brauch kein Php ich möchte in eine Shell von Unix nen Befehl eingeben oder nen kleines Skript haben, dass ich dann von der Shell aufrufen kann. Ich habe keinen Webserver sondern nen Mac der bietet ne shell zur Verfügung.

So in der Art: habe ich im Forum gefunden.
for i in Fun*; do mv "$i" "${i/Fun - /}"; done
 
Hallo
Um das aus der Shell durchzuführen, rate ich dir das Verzeichnis vorher als root mit den Rechten auszustatten.
Code:
chown -R user /absolut/path/
Dann kannst du ein sehr simples Script oder direkten Befehl laufen lassen.
Du musst allerdings den Prefix anpassen , also <PREFIX> durch deinen ersetzen.
Code:
C=0;for I in $(find ./ -type f -name "<PREFIX>*"); do echo $I ${I/<PREFIX>/$((C++))_};done;

Gruß Wolfgang
 
Naja so ganz ist das nit was ich wollte. Es soll jede Datei aufsteigend nummeriert werden. also das am Ende die dateien im Ordner die Namen 1.txt,2.txt,3.txt,4.txt.... haben. Fehlt da nicht eine Zählschleife?

Mfg
Tommyboy
 
Naja so ganz ist das nit was ich wollte. Es soll jede Datei aufsteigend nummeriert werden. also das am Ende die dateien im Ordner die Namen 1.txt,2.txt,3.txt,4.txt.... haben. Fehlt da nicht eine Zählschleife?

Mfg
Tommyboy

Hast du es probiert?
Natürlich wird gezählt.
Was meinst du wohl was $((C++)) macht?
 
Hi,

also wenn ich den code so in die shell kopiere und ausführe tut sich nix, habe als Präfix 1 eingesetzt, war das falsch? Die Dateien werden aufgelistet haben aber noch den selben namen wie vorher? Ich möchte halt dass jede Datei umbenannt wird, aber wenn ich denn Code eingebe, wird nur der Ordnerinhalt ausgegeben.

Gruß Tommyboy
 
Zuletzt bearbeitet:
Hi,

also wenn ich den code so in die shell kopiere und ausführe tut sich nix, habe als Präfix 1 eingesetzt, war das falsch?
Gruß Tommyboy

Ja!
Schau dir mal die Manpage zu find an.

Wenn du alle Dateien die mit "myfile" beginnen willst, dann ist Prefix "myfile".
Willst du alle Dateien (egal welchen Namen sie haben) eine Incrementalzahl voranstellen.
Dann gibt es keinen Prefix, das gilt auch für die Auswahl nach einem Suffix
Verschiebt alle Dateien von name nach <ZIFFER>_name.
Code:
C=0;for I in $(find ./ -type f ); do echo "$I" $(dirname "$I" )/$((C++))_$(basename "$I");done;

Gruß Wolfgang
 
Zurück
Oben