Dateien umbenennen ( <|>:/ )

Data 191088

Cadet 4th Year
Registriert
Juni 2008
Beiträge
78
Hi.
Ich bin Windows Nutzer und habe eig. keine Ahnung von der Linux Kommandozeile.
Problem: Mein Cousin hat meine Musikbibliothek mit "Music-Brainz" umbenannt und nun sind die Sonderzeichen (siehe Titel) in den Datei und Ordnernahmen ...
Es existieren auch Ordner mit gleichem Namen, nur einmal groß und klein geschrieben (Win macht da aber kein Unterschied, sodass ich nur auf einen zugreifen kann)!
Linux konnte sie auf eine Win-Partition kopieren aber mit Windows kann ich nichts umbenennen.
Wie kann ich Linux folgendes sagen:

mv <Pfad>+alle Unterordner Zeichen ":" durch "_" ersetzen.

Da ich mich nur sehr selten mal mit ner Kommandozeile auseinandersetze bin ich von den Hilfetexten überfordert und hoffe, dass ihr mir helfen könnt.
... besonders mit der GROß und groß Schreibung ... ich stelle mir vor:
wenn Unterordner ab <Pfad> Uppercase = identisch dann setze ein "_" hinter einen von beiden.

wenn das nicht geht, muss ichs eben manuell machen, aber die Sonderzeichen sind in der Summe ~ 3.000 Dateien & Ordner.

DANKE
Ergänzung ()

mir sind noch 3 eingefallen, die umzubenennen währen: _ " ? *
 
Zuletzt bearbeitet:
Sowas geht ganz gut mit sed, schau dir mal die manpage an. Zumindest dein erster Fall lässt sich damit lösen, beim zweiten wirds vielleicht etwas kniffliger.
 
"sed" ... was ist das? ich habe mit Open Suse 11.4 gezogen und in deren Befehlen steht nur "set" und das ist bestimmt nicht das gemeinte feature.

"Detox" ... aber wie kann ich die Parameter genauer festlegen? ... detox scheint die Sonderzeichen ausnahmslos umzubenennen, ich mag aber nur diese hier: <|>/:"*? umbenennen. z.B. "Space", & ... wollte ich bestehen lassen.
--> wäre es möglich indem ich z.B. die "iso8859_1.tbl" an meine Bedürfnisse anpasse?

Ich belese mich daweile, wie ich eine HDD mounte, da ich das als Linux-Analphabet auch nicht kann :-(
 
Jedes Linux sollte sed haben (vom Gegenteil lasse ich mich aber auch überzeugen). Gib doch einfach mal "man sed" ein.
Ein kleines Beispiel:

sed 's/Hallo/Tschüss/g'

ersetzt in einer Pipe den String Hallo durch Tschüss. Das ganze mit Dateinamen zu machen ist natürlich ein wenig Fummelei.
Wenn du nach eigenen Angaben Linux Analphabet bist, ist das aber vielleicht etwas kompliziert, vielleicht ist ja das andere genannte Programm geeigneter.

PS: Hat dieses "Programm", welches dein Cousin verwendet hat, nicht ein Backup des alten Verzeichnisbaums gemacht?
 
Zuletzt bearbeitet:
sed ist für komplexe textersetzung gedacht. hier eignet sich tr besser.

for file in $(find /insert/your/path); do
newname=$(echo "$file" | tr '"?*' '___')
if [ "$file" != "$newname" ]; then
mv "$file" $newname"
fi
done


ACHTUNG: funktioniert so nur wenn es keine verzeichnisse und dateien mit leerzeichen oder tabs im namen gibt.
 
Dafür brauchts nichtmal tr, bash kann sowas selber. Wie auch immer, hab dir ein leicht abgewandeltes script angehängt, welches ich zum bereinigen von mac filename verkrüppelungen benutze. Es ersetzt jedoch ':' durch '-', mit doppelten namen kanns nix anfangen, gibt einfach eine Fehlermeldung raus. aber das würde auch nur passieren, wenn ein : drin wäre, sonst wirds eh nicht beachtet.

Auch für " und * hab ich nix eingebaut, müsstest dir nachbasteln (copy/paste/adapt die $do_question einträge)

Um doppelte namen zu finden könnte man etwas per find/sort/diff/... basteln, aber hab ich grad nix auf lager. Achja, um von Aug auf die doppelten zu stossen: "find PFAD -type d | sort --ignore-case"
Sortiert findet man sowas relativ schnell.

wie auch immer, script speichern als fixnames.sh, und ausführbar machen: chmod 755 fixnames.sh

Dann via "./fixnames.sh --colon --question PFAD" ausführen.
Um erstmal anzuzeigen, welche dateien bearbeitet werden würden: "./fixnames.sh --colon --question -p PFAD"
 
Zuletzt bearbeitet:
Ja, es gibt ein Bacup der ursprünglichen Daten, aber das dient nur dazu, wenn nichts geht / größte Datenverluste auftreten.
... Ich wollte die Arbeit von meinem Cousin nicht ignorieren, nur den "bug" beheben.

Ich versuchs mit dem Script. da ich schonmal 30 Seiten C++ gelesen hatte, glaube ich dieses Script auf alle meine weiteren Wünsche, was Sonderzeichen betrifft erweitern zu können.
... Ich mache Vorsichtshalber noch nen HDD Image als Bacup, falls ich Mist baue ;)
... Speicher habe ich zum Glück genug :D

DANKE ... melde mich im Laufe der nächsten Woche mal wieder
 
Das script sollte eigentlich nichts killen, aber, Garantien geb ich natürlich trotzdem keine ;)

C++ nützt dir da allerdings nicht viel (schon gar keine 30 Seiten davon). Das Script ist Bash
 
Ja, es kann mir nur in sofern helfen, dass ich mal was von dem Aufbau einer Programmierung gehört habe ;-)
... Kann das so mit LEERZEICHEN umgehen (sieht aus als könne es)?
... meine Pfade sind voll davon, in fast jedem Ordner / Name befindet sich mindestens eines!
... ich lese daweile Bash und dein Script um es zu verstehen.
 
Zuletzt bearbeitet:
Ja, das script kommt mit leerzeichen in den Pfaden / Dateinamen zurecht.
 
Ich habe mich nun eine ganze Weile mit dem Script und der Definition der Operatoren vertraut gemacht und die Datei angepasst, sodass dieses Script nun eigentlich auch nach _<>|* _suchen sollte.

Um die Fehlermeldung zu umgehen, die erscheinen soll, wenn ein Zielname schon existiert:

Code:
	fixed_full="$file_path/$fixed_name"
	[ "$fixed_name" = "$file_name" ] && continue
	if [ -e "$fixed_full" ]; then
		echo "Error: target already exists: '$fixed_full'" 2>&1
		continue
	fi
Kann man da nicht einfach ein "_" an das entsprechende ende hängen? ... dieses "einfach" ist für mich zu schwer, da dies
1. am Ende eines Namens und
2. bei einer Datei noch vor die Namenserweiterung sollte.
... Eine Fehlerausgabe in eine Datei währe dabei ja vielleicht dennoch als extra sinnvoll.
Ich weis nicht, on ich mit 0 Fähigkeiten alles korrekt geschrieben habe. In dem *.rtf Dokument habe ich meine Änderungen hervorgehoben, sowie in Textfelder Programmierhilfen zu den Befehlen + links eingefügt.

Ich währe für ein Feedback dankbar, da ich kein Bacup anfertigen kann (chronischer Speicherplatzschwund) xD
 

Anhänge

Hab mal ein paar Kleinigkeiten korrigiert. Bitte nicht mit Wordpad/Word oder dergleichen arbeiten, nimm doch zb. Notepad++. Die Änderungen zwischen zwei Textdateien kannst du wunderbar zb. mittels WinMerge sehen.

Neu: Falls Datei schon vorhanden, _1, _2, ... _9 probieren.

Achtung: Ich habe die Änderungen nicht getestet. Am besten schaust du dir einfach an, was ein --dry-run oder --print-only ausgibt.

Fehlerausgaben in eine Datei speichern machst du so:

./fixnames.sh --gewuenschte-optionen PFAD 2> /tmp/fehler.txt

oder 2>> zum anhängen, statt überschreiben.
 
Zuletzt bearbeitet:
Zurück
Oben