Buchstaben im Dateiname ändern

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
gnude
Beiträge: 1567
Registriert: 14.09.2009 22:05:28
Kontaktdaten:

Buchstaben im Dateiname ändern

Beitrag von gnude » 14.09.2021 09:30:32

Hallo
ich habe ein interessantes Problem, bei dem ich dachte "das geht mit Linux leicht" und doch finde ich keine passende Lösung.
Habe mehrere Dateien die eine Klammer im Dateinamen habe, und das über verschiedene Unterverzeichnisse verteilt.
Beispiel:
/home/Bilder/Sommer(1).jpg
/home/Bilder/Sommer(2).jpg
/home/Bilder/Urlaub/Strand(1).jpg
und so weiter....
Jetzt möchte ich gern alle Dateien inklusive denen in Unterverzeichnissen von der Klammer befreien und die durch ein "-" ersetzten.
so das sie dann heisst:
/home/Bilder/Sommer-1-.jpg
Es gibt wohl das Paket "rename" zum Umbenennen von Dateien mit regulären Ausdrücken allerdings beachtet es wohl keine Unterverzeichnisse.

Hat jemand eine Idee oder vielleicht ein Script das dieses Problem löst?

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

Re: Buchstaben im Dateiname ändern

Beitrag von tobo » 14.09.2021 09:55:22

Ja, rename arbeitet nicht rekursiv. Eine einfache Lösung ist daher z.B. find vorzuschalten:

Code: Alles auswählen

find . -type f -name '*(*)*' -exec rename -n 's/\(/-/g;s/\)/-/g' {} +
Wenn das so stimmt, dann den Simulationsschalter von rename (-n) entfernen.

Benutzeravatar
gnude
Beiträge: 1567
Registriert: 14.09.2009 22:05:28
Kontaktdaten:

Re: Buchstaben im Dateiname ändern

Beitrag von gnude » 14.09.2021 10:40:11

Perfekt, es funktioniert. Vielen Dank! :THX:

Benutzeravatar
hikaru
Moderator
Beiträge: 13585
Registriert: 09.04.2008 12:48:59

Re: Buchstaben im Dateiname ändern

Beitrag von hikaru » 14.09.2021 11:00:49

tobo hat geschrieben: ↑ zum Beitrag ↑
14.09.2021 09:55:22

Code: Alles auswählen

's/\(/-/g;s/\)/-/g'
Mein Vorschlag für das Regex-Pattern hätte so ausgesehen:

Code: Alles auswählen

's#\((\d+)\)#-$1-#g'
Die eine Lösung funktioniert vermutlich so gut wie die andere. Daher soll das keine Kritik an deiner Lösung sein.
Mir geht es hier eher um den allgemeinen Hinweis, dass man mit der Formulierung von Aufgabe und Lösung sehr präzise sein sollte, wenn die Lösung eine Regex-Ersetzung ist.

Am konkreten Beispiel:
gnude hat geschrieben: ↑ zum Beitrag ↑
14.09.2021 09:30:32
Habe mehrere Dateien die eine Klammer im Dateinamen habe,
[..]
Jetzt möchte ich gern alle Dateien [..] von der Klammer befreien und die durch ein "-" ersetzten.
Die Lösung von tobo passt perfekt auf diese formulierte Aufgabenstellung. Meine nicht.
Allerdings lassen mich die Beispiele vermuten, dass die Aufgabenstellung eigentlich eine andere ist:
gnude hat geschrieben: ↑ zum Beitrag ↑
14.09.2021 09:30:32
Beispiel:
/home/Bilder/Sommer(1).jpg
/home/Bilder/Sommer(2).jpg
/home/Bilder/Urlaub/Strand(1).jpg
In Prosa:
Ich habe mehrere Dateien die eine Zahl, umschlossen von Klammern, im Dateinamen haben.
Jetzt möchte ich in allen Dateien diese umschließenden Klammern durch "-" ersetzen.
Ich finde, darauf passt meine Lösung besser, denn sie berücksichtigt, dass die Klammern paarweise vorkommen und eine Zahl umschließen. Wie gesagt, im konkreten Beispiel ist das vermutlich egal, aber um mal ein (hoffentlich etwas abwegiges) Beispiel zu bringen, wo der Unterschied wichtig wäre:

Code: Alles auswählen

$ touch 'Hallo Schatz :).txt'
$ ls *.txt
'Hallo Schatz :).txt'
tobos Lösung macht daraus:

Code: Alles auswählen

$ rename -n 's/\(/-/g;s/\)/-/g' *
rename(Hallo Schatz :).txt, Hallo Schatz :-.txt)
Meine nicht.

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Buchstaben im Dateiname ändern

Beitrag von Meillo » 14.09.2021 11:52:05

Ja, es kommt darauf an, was man haben will und aus welchem Grund. Sollen einfach alle runden Klammern aus den Dateinamen entfernt werden, oder will man das Muster Klammer-Zahl-Klammer umbauen. Meist ist dabei hilfreich zu wissen, *warum* man die Aenderung machen will, weil das Rueckschluesse darauf erlaubt wie die Umsetzung sein sollte.


Anyways, wenn ich einfach eine gewisse Menge an Zeichen entfernen oder mit einem Zeichen ersetzen wollen wuerde, dann wuerde ich es mit einer Zeichenklasse machen:

Code: Alles auswählen

's/[()]/-/g'
Fuer das Klammermuster finde ich hikarus Vorschlag optimal.
Use ed once in a while!

Antworten