Dateinamen bereinigen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
rannseier
Beiträge: 79
Registriert: 24.09.2007 12:37:30

Dateinamen bereinigen

Beitrag von rannseier » 04.02.2017 16:16:32

Hallo zusammen,

Ich habe meine Festplatten der letzten 10 Jahre aufgeräumt und nun die Aufgabe, den ganzen Krempel mal ein wenig aufzuräumen.

Probleme:
- Anstelle von Leerzeichen wurde z.B. Punkte oder Unterstriche verwendet. Diese sollen wieder, wo es Sinn ergibt, in Leerzeichen umgewandelt werden. Gleichzeitig soll natürlich die Dateiendungen (.txt) erhalten bleiben.

- Machmal gibt es Zusätze wie <Leerzeichen>(2009), dies soll dann in <Leerzeichen><Bindestrich><Leerzeichen>2009 umgewandelt werden.

Hat jemand eine Idee, wie ich das anstellen kann? Optik ist mir dabei egal, es muss nur funktionieren. ;)


Gruß,
Karl

TomL

Re: Dateinamen bereinigen

Beitrag von TomL » 04.02.2017 16:24:29

Der Double-Commander hat ein tolles Feature zur Gruppen-Umbenennung von Dateien in einem Verzeichnis, mit gleichzeitigen Ersetzen, Nummerieren, Anfügen, Entfernen... ich nutze das gerne und häufig.

In Stretch ist die aktuelle Version 0.7.7 enthalten, in Jessie weiss ich grad nicht. Wenn sie in Jessie zu alt wäre, würde ich lieber die Version von der Projektseite installieren. Und ich würde von der GTK-Variante abraten, die hat durchgängig Probleme bei mir verursacht.
apt show doublecmd-qt

breakthewall
Beiträge: 507
Registriert: 30.12.2016 23:48:51

Re: Dateinamen bereinigen

Beitrag von breakthewall » 04.02.2017 18:30:11

Es soll also nur dort in Leerzeichen umgewandelt werden, wo es Sinn ergibt. Woher weiß ein Programm denn, was für dich optisch Sinn ergibt je nach Datei?
Das klingt schon nach erheblichem Aufwand, wo man mit etwas Einheitlichem evtl. besser beraten wäre. Und man muss einem Programm letztlich auch exakte Parameter vorgeben, wonach es agieren soll. Würde dir auch anraten, Leerzeichen in Datei -oder Ordnernamen nicht zu erhalten, besser noch sie zu meiden. Sie sorgen nur nachhaltig für Probleme. Es ist zwar möglich, aber bedeutet eben unnötige Mehrarbeit.

Die folgende Kommandozeile, würde bspw. aus allen Datei -und Ordnernamen, jeweils die Leerzeichen durch Bindestriche ersetzen, wie auch jedwede Zeichen löschen die dem erlaubten Muster nicht entsprechen.

Code: Alles auswählen

find Pfad_zum_Ordner | rename -n "s/[[:space:]]/-/g;s/[^.a-zA-Z0-9-\/]//g"
Bei rename ist der Parameter -n definiert, wodurch Änderungen nur auf dem Terminal ausgegeben werden. Sollen die Daten real editiert werden, so muss der Parameter entfernt werden.

Sinnvoll wäre auch mal betreffende Dateinamen im Original zu sehen. Besonders jene die unterschiedlich gehandhabt werden sollen.

tobo
Beiträge: 2339
Registriert: 10.12.2008 10:51:41

Re: Dateinamen bereinigen

Beitrag von tobo » 04.02.2017 22:07:20

breakthewall hat geschrieben:Die folgende Kommandozeile, würde bspw. aus allen Datei -und Ordnernamen, jeweils die Leerzeichen durch Bindestriche ersetzen, wie auch jedwede Zeichen löschen die dem erlaubten Muster nicht entsprechen.

Code: Alles auswählen

find Pfad_zum_Ordner | rename -n "s/[[:space:]]/-/g;s/[^.a-zA-Z0-9-\/]//g"
Rename ist eigentlich nur ohne Verzeichnisstruktur zu gebrauchen. Wenn z.B. sowas von find kommt "/home/da tei1/da tei2.txt", dann wird rename scheitern, da er die Datei nicht findet, weil das Verzeichnis (nach der Verzeichnisänderung) nicht vorhanden ist. Und zwar egal wie man's dreht - ob mit einem find | tac | rename oder mit einem vorhergehenden ändern von "/home/da tei1". Entweder man bastelt sich da was mit rename zusammen oder man lässt die find-Zeile so oft laufen, bis kein Fehler mehr kommt!?

breakthewall
Beiträge: 507
Registriert: 30.12.2016 23:48:51

Re: Dateinamen bereinigen

Beitrag von breakthewall » 09.02.2017 14:38:11

tobo hat geschrieben:Rename ist eigentlich nur ohne Verzeichnisstruktur zu gebrauchen. Wenn z.B. sowas von find kommt "/home/da tei1/da tei2.txt", dann wird rename scheitern, da er die Datei nicht findet, weil das Verzeichnis (nach der Verzeichnisänderung) nicht vorhanden ist. Und zwar egal wie man's dreht - ob mit einem find | tac | rename oder mit einem vorhergehenden ändern von "/home/da tei1". Entweder man bastelt sich da was mit rename zusammen oder man lässt die find-Zeile so oft laufen, bis kein Fehler mehr kommt!?
Eigentlich ist rename für solch komplexe Aufgaben, alleine gar nicht zu gebrauchen. Besonders ist rename nicht fähig rekursiv zu arbeiten, was eine Ausführung für jedes einzelne Verzeichnis erfordern würde. selbst via Schleife ausgeführt, ist Rekursivität ohne zusätzliche Shell-Optionen nicht drin. Auch kann kein Programm wissen, wie für ihn eine sinnvoll individuelle Umbenennung pro Datei aussieht. Sicher kann man gewisse rudimentäre Kommandozeilen erstellen, aber ab hier wird es nur noch exponentiell schwieriger alles mit einzubeziehen. Daher würde die angegebene Kommandozeile mehrfach ausgeführt, zunächst alle Dateien und Ordner auf ein sauberes und kompatibles Level bringen, worauf man letztlich aufbauen kann. Sicher ist die Kommandozeile nicht perfekt, und dennoch funktioniert sie sehr gut zum Bereinigen, auch wenn es für so eine Aufgabe keine perfekte Lösung gibt. So oder so wird man selbst Hand anlegen müssen, wenn alle Dateien nach individuellem Schema umbenannt werden.

wanne
Moderator
Beiträge: 7548
Registriert: 24.05.2010 12:39:42

Re: Dateinamen bereinigen

Beitrag von wanne » 09.02.2017 16:26:21

tobo hat geschrieben:Und zwar egal wie man's dreht - ob mit einem find | tac | rename oder mit einem vorhergehenden ändern von "/home/da tei1". Entweder man bastelt sich da was mit rename zusammen oder man lässt die find-Zeile so oft laufen, bis kein Fehler mehr kommt!?

Code: Alles auswählen

find -depth
Ansonsten guck dir mal krusader und krename an. Die sind grafisch können aber auch rekursiv. (Wenn ich mich richtig erinnere.
rot: Moderator wanne spricht, default: User wanne spricht.

tobo
Beiträge: 2339
Registriert: 10.12.2008 10:51:41

Re: Dateinamen bereinigen

Beitrag von tobo » 09.02.2017 18:03:05

-depth entspricht leider nur dem oben erwähnten einfügen von tac in der pipe. Würde also nichts bringen, da rename das nicht auflösen kann. Aber selbst wenn rename das rekursiv (an einer Datei) lösen könnte, dann wäre die Lösung in Kombination mit find (in einem Lauf) nicht umzusetzen, da die nachfolgenden find-Funde dann ja keinen existierenden Pfad mehr hätten. Trotzdem danke, -depth war mir (ersichtlich an dem tac) nicht bekannt - ist allerdings auch nicht mein Thread!?

Antworten