Dateinamen ändern mit sed

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
HumiNi
Beiträge: 281
Registriert: 02.10.2014 21:46:18

Dateinamen ändern mit sed

Beitrag von HumiNi » 29.01.2024 17:18:30

Moin

Ich bin dabei, die Namen meiner langjährigen Fotosammlung zu konsolidieren bzw. nur die zum Teil in Großbuchstaben vorliegenden Dateinamen konsequent in Kleinbuchstaben zu ändern.
Eigentlich kein Ding, aber:
Aus bestimmten Gründen liegen die Listen der Fotos teils mit / teils ohne Pfad vor. Das will ich nicht ändern, sondern ich möchte sed clever einsetzen. Großbuchstaben im Pfadnamen sollen erhalten bleiben (die Pfade heißen z.B. Urlaub in Absurdistan).

Meine Beispielliste:

Code: Alles auswählen

dsc0001.jpg
dsc0002.JPG
Dsc0003.JpeG
DIR1/dsc0011.jpg
./dsc0012.JPG
dir 3/Dsc0013.JpeG
DIR 4/dsc0021.jpg
./dsc0022.jpg
Mein Kommando inkl. Ausgabe:

Code: Alles auswählen

$ cat liste | sed 's/\(.*\/\)\(.*\)/\1\L\2/'
dsc0001.jpg
dsc0002.JPG
Dsc0003.JpeG
DIR1/dsc0011.jpg
./dsc0012.jpg
dir 3/dsc0013.jpeg
DIR 4/dsc0021.jpg
./dsc0022.jpg
Wie man sieht, funktioniert die unterschiedliche Behandlung von Pfad- und Dateinamen, allerdings funktioniert das nicht für Einträge ohne Pfad.

Hat jemand einen Tipp für mich? Danke.
Gedächtnis wie ein Rechen: Nur Mist bleibt hängen.

debianoli
Beiträge: 4062
Registriert: 07.11.2007 13:58:49
Wohnort: Augschburg

Re: Dateinamen ändern mit sed

Beitrag von debianoli » 30.01.2024 06:07:36

Wieso willst du sed für das Ändern der Dateinamen nehmen? Das kann sed doch nicht, sed ändert nur den Inhalt von Dateien. Für die Namensänderung kenne ich nur Tools wie mv oder Debianrename plus Gui-Tools wie zB Debiankrename

Auch finde ich deinen Ansatz nicht zielführend für viele Fotos. Jede moderne Fotoverwaltung interessiert sich nicht für den Dateinamen, sondern für die exif-Daten im Foto selber und baut mit denen seine Foto-Datenbank auf. Das macht bei vielen Fotos nach meiner Erfahrung viel mehr Sinn. Du kannst zusätzlich Infos wie "Urlaub Meer" als exif-Tag im Foto hinterlegen. Und das kann man auch scripten mit zB Debianexiftool

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

Re: Dateinamen ändern mit sed

Beitrag von Meillo » 30.01.2024 08:27:04

Wenn du es lieber interaktiv also mit Vorschau im Editor machen willst (im vi kann man ja auch mit Regexps Suchen-Ersetzen), dann kannst du dafuer `qmv' aus Debianrenameutils verwenden. (Ich nutze `emv' von http://www.i0i0.de/toolchest/emv, was letztlich das gleiche kann.)
Use ed once in a while!

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

Re: Dateinamen ändern mit sed

Beitrag von Meillo » 30.01.2024 08:30:38

HumiNi hat geschrieben: ↑ zum Beitrag ↑
29.01.2024 17:18:30
Mein Kommando inkl. Ausgabe:

Code: Alles auswählen

$ cat liste | sed 's/\(.*\/\)\(.*\)/\1\L\2/'
dsc0001.jpg
dsc0002.JPG
Dsc0003.JpeG
DIR1/dsc0011.jpg
./dsc0012.jpg
dir 3/dsc0013.jpeg
DIR 4/dsc0021.jpg
./dsc0022.jpg
Wie man sieht, funktioniert die unterschiedliche Behandlung von Pfad- und Dateinamen, allerdings funktioniert das nicht für Einträge ohne Pfad.
Wenn du statt `cat liste' ein `find . -type f' verwendest, dann beginnt jeder Dateiname mit `./' und dein sed-Befehl sollte funktionieren.
Use ed once in a while!

dirk11
Beiträge: 2809
Registriert: 02.07.2013 11:47:01

Re: Dateinamen ändern mit sed

Beitrag von dirk11 » 30.01.2024 09:50:39

Ein

Code: Alles auswählen

find . -type f | sed 's/\(.*\/\)\(.*\)/\1\L\2/'
wandelt also alle gemischten Dateinamen konsequent und vollständig im aktuellen Verzeichnis (und nur dort, nicht in übergeordneten und auch nicht in Unterverzeichnissen) in kleinbuchstabige Dateinamen um? Habe ich das so richtig verstanden?

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

Re: Dateinamen ändern mit sed

Beitrag von hikaru » 30.01.2024 10:25:56

dirk11 hat geschrieben: ↑ zum Beitrag ↑
30.01.2024 09:50:39
Ein

Code: Alles auswählen

find . -type f | sed 's/\(.*\/\)\(.*\)/\1\L\2/'
wandelt also alle gemischten Dateinamen konsequent und vollständig im aktuellen Verzeichnis (und nur dort, nicht in übergeordneten und auch nicht in Unterverzeichnissen) in kleinbuchstabige Dateinamen um? Habe ich das so richtig verstanden?
find steigt auch in Unterverzeichnisse ab, es sei denn du begrenzt das mit --maxdepth

debianoli hat geschrieben: ↑ zum Beitrag ↑
30.01.2024 06:07:36
Jede moderne Fotoverwaltung interessiert sich nicht für den Dateinamen, sondern für die exif-Daten im Foto selber und baut mit denen seine Foto-Datenbank auf.
Das ist aber langsamer, weil für die Exif-Daten jede Datei erst angelesen werden muss. Um dem zu begegnen, bauen solche Programme eine DB auf, die sie dann im Speicher halten. Um diese DB aktuell zu halten wird ein Indizierungsdienst benötigt, der mehr oder weniger ständig im Hintergrund läuft. Solche Dienste laufen gern mal amok. Debiantumbler ist z.B. berühmt dafür.
Wenn man mehr Informationen verwalten will, als sich im Dateinamen sinnvoll unterbringen lassen, dann ergeben solche Lösungen durchaus Sinn, aber wenn es nur darum geht, festzuhalten, wann und wo Fotos entstanden sind, dann plädiere ich für KISS und eine Lösung über den Dateinamen.

HumiNi
Beiträge: 281
Registriert: 02.10.2014 21:46:18

Re: Dateinamen ändern mit sed

Beitrag von HumiNi » 30.01.2024 10:48:37

Meillo hat geschrieben: ↑ zum Beitrag ↑
30.01.2024 08:30:38
Wenn du statt `cat liste' ein `find . -type f' verwendest, dann beginnt jeder Dateiname mit `./' und dein sed-Befehl sollte funktionieren.
Die Listen liegen teils vor, sind bereits auf unterschiedliche Weise erzeugt und zusammengefügt worden und haben bereits solche gemischten Zeilen. Aber mir ist trotzdem etwas ähnliches in den Sinn gekommen. Ich könnte für jede Zeile in der Liste (absolute Pfadnamen gibt es nicht, aber auch das wäre händelbar) vor dem sed ein "./" einfügen.
Ursprüngliche hatte ich allerdings gehofft, ich könnte es direkt im sed-Muster lösen, ähnlich wie $NF im awk.
Das Ganze passiert innerhalb eines Scriptes, welche noch mehr macht und zukunftstauglich sein soll, also z.B. für einzelne dazukommende Dateien mit "script file1 file2..." aufrufbar sein soll. Im Moment verträgt es die gemischte Übergabe von Dateinamen und Verzeichnissen (mit und ohne Rekursion). Da steckt natürlich wegen erlaubter Namen mit Leerzeichen etwas mehr drin als cat, find, for und while.

BTW. Ich organisiere mir meine Dateien lieber selbst auf Verzeichnisebene. So kann ich z.B. bei Fotos auch viel einfacher und gezielt Medien zum Abspielen/Ansehen auf anderen Geräten beschreiben. Ist vielleicht oldschool...
Außerdem erzeuge ich mir zuerst den neuen Dateinamen, um vor dem eigentlichen Umbenennen damit noch andere Operationen durchzuführen.

Danke für die Hinweise.
Gedächtnis wie ein Rechen: Nur Mist bleibt hängen.

HumiNi
Beiträge: 281
Registriert: 02.10.2014 21:46:18

Re: Dateinamen ändern mit sed

Beitrag von HumiNi » 30.01.2024 10:55:29

hikaru hat geschrieben: ↑ zum Beitrag ↑
30.01.2024 10:25:56
dann plädiere ich für ... eine Lösung über den Dateinamen.
... und des Zeitstempels der Datei passend zur Aufnahme. Auch diese Korrektur anhand der oft vorhandenen Metadaten ist Teil meiner Fotoorganisation.
Gedächtnis wie ein Rechen: Nur Mist bleibt hängen.

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

Re: Dateinamen ändern mit sed

Beitrag von Meillo » 30.01.2024 10:55:45

dirk11 hat geschrieben: ↑ zum Beitrag ↑
30.01.2024 09:50:39
Ein

Code: Alles auswählen

find . -type f | sed 's/\(.*\/\)\(.*\)/\1\L\2/'
wandelt also alle gemischten Dateinamen konsequent und vollständig im aktuellen Verzeichnis (und nur dort, nicht in übergeordneten und auch nicht in Unterverzeichnissen) in kleinbuchstabige Dateinamen um? Habe ich das so richtig verstanden?
Nein. Dieser Befehl veraendert nur die Ausgabe. Wenn man die Dateien umbenennen will, dann muss man noch etwas mehr machen.
Use ed once in a while!

dirk11
Beiträge: 2809
Registriert: 02.07.2013 11:47:01

Re: Dateinamen ändern mit sed

Beitrag von dirk11 » 30.01.2024 11:16:05

Oh, ok, danke! Man muss also diese Ausgabe dann wieder in einen Befehl einkippen, der die Datei umbenennt, richtig?

HumiNi
Beiträge: 281
Registriert: 02.10.2014 21:46:18

Re: Dateinamen ändern mit sed

Beitrag von HumiNi » 30.01.2024 12:25:52

dirk11 hat geschrieben: ↑ zum Beitrag ↑
30.01.2024 11:16:05
Oh, ok, danke! Man muss also diese Ausgabe dann wieder in einen Befehl einkippen, der die Datei umbenennt, richtig?
Klar. Dein Kommando ändert ja nur die Ausgabe des find-Befehls und sonst gar nichts.
Zum Ändern des Dateinamens musst du natürlich pro Dateiname den Eingabestring (für sed) und seine seine veränderte Ausgabe in einem passenden Kommando zur Umbenennung (wie mv) verarbeiten.
Bei einer Liste von Dateinamen (wie hier mit find) brauchst du mindestens eine schlaue Schleife.
Mein Ansatz war jedoch, die Dateinamen schon in der Liste zu haben und diese zeilenweise in einer Schleife einzulesen und zu verarbeiten. Eine Operation in der Schleife ist das Umbenennen der Datei in einen von sed angepassten Namen.
Gedächtnis wie ein Rechen: Nur Mist bleibt hängen.

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

Re: Dateinamen ändern mit sed

Beitrag von tobo » 12.02.2024 23:46:18

Falls das Problem noch besteht:

Code: Alles auswählen

$ echo "dsc0001.jpg
dsc0002.JPG
Dsc0003.JpeG
DIR1/dsc0011.jpg
./dsc0012.JPG
dir 3/Dsc0013.JpeG
DIR 4/dsc0021.jpg
./dsc0022.jpg
A/B" | sed -E 's/[^/]+$/\L&/'
dsc0001.jpg
dsc0002.jpg
dsc0003.jpeg
DIR1/dsc0011.jpg
./dsc0012.jpg
dir 3/dsc0013.jpeg
DIR 4/dsc0021.jpg
./dsc0022.jpg
A/b
$

Antworten