Dateinamen von mehreren Dateien in einer Schleife korrigieren

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Cordess
Beiträge: 422
Registriert: 09.01.2006 00:37:22

Dateinamen von mehreren Dateien in einer Schleife korrigieren

Beitrag von Cordess » 08.09.2023 06:11:24

Ich habe eine Reihe von Bilddateien, die aus einem Gruppennamen gefolgt von einer Nummer bestehen.
Die Nummer ist bei jeder Datei verschieden, der Gruppenname ist immer gleich, allerdings falsch geschrieben.

Das wollte ich jetzt in einer Schleife korrigieren.

Die Dateien sehen bspw. so aus:

Code: Alles auswählen

invasive_aten_0001.png
invasive_aten_0002.png
invasive_aten_0003.png
...
invasive_aten_0231.png
und sollen zu:

Code: Alles auswählen

invasive_arten_0001.png
invasive_arten_0002.png
invasive_arten_0003.png
...
invasive_arten_0231.png
korrigiert werden.

Ich dachte da an ein Bash Script mit einer for Schleife, bei dem ich die Nummer mitsamt nachfolgender Dateiendung abtrenne und dann das ganze per mv Befehl in einen neuen Dateinamen schreibe, bei dem ich dann die korrekte Schreibweise wieder vorne dranhänge.

Das habe ich jetzt so gelöst, die Lösung funktioniert auch, aber ich frage mich, ob es dafür bessere Lösungen gibt?

Code: Alles auswählen

for FILE in invasive*; do awk 'FNR == 1{ print FILENAME }' $FILE | mv $FILE invasive_arten_`awk 'BEGIN {FS="_"} { print $3 }'`  ; done

Benutzeravatar
GregorS
Beiträge: 2633
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

Re: Dateinamen von mehreren Dateien in einer Schleife korrigieren

Beitrag von GregorS » 08.09.2023 06:21:57

Mein Vorschlag:

Code: Alles auswählen

gszaktilla@lili:~/test$ touch flasch001 flasch002 flasch003
gszaktilla@lili:~/test$ ls -l
insgesamt 0
-rw-r--r-- 1 gszaktilla gszaktilla 0  8. Sep 06:19 flasch001
-rw-r--r-- 1 gszaktilla gszaktilla 0  8. Sep 06:19 flasch002
-rw-r--r-- 1 gszaktilla gszaktilla 0  8. Sep 06:19 flasch003
gszaktilla@lili:~/test$ for SRC in * ; do  DST=`echo $SRC | sed s/flasch/falsch/g` ; mv $SRC $DST; done
gszaktilla@lili:~/test$ ls -l
insgesamt 0
-rw-r--r-- 1 gszaktilla gszaktilla 0  8. Sep 06:19 falsch001
-rw-r--r-- 1 gszaktilla gszaktilla 0  8. Sep 06:19 falsch002
-rw-r--r-- 1 gszaktilla gszaktilla 0  8. Sep 06:19 falsch003
Gruß

Gregor
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])

Cordess
Beiträge: 422
Registriert: 09.01.2006 00:37:22

Re: Dateinamen von mehreren Dateien in einer Schleife korrigieren

Beitrag von Cordess » 08.09.2023 07:11:45

Danke, ich habe deine Version gerade getestet und sie funktioniert auch wunderbar.

Mit sed arbeite ich so gut wie nie, ich fand awk schon immer einfacher und daher intuitiver. Aber das ist natürlich Geschmackssache.

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

Re: Dateinamen von mehreren Dateien in einer Schleife korrigieren

Beitrag von Meillo » 08.09.2023 07:38:53

Siehe auch viewtopic.php?t=177188

Ich mache sowas meist interaktiv mit emv im Editor:

Code: Alles auswählen

emv invasive*
dann geht bei mir der vi auf, in dem ich dann:

Code: Alles auswählen

:%s,aten,arten,
:wq
eingebe ... und fertig ist das Umbenennen :-)

Die meisten wuerden wohl `rename' verwenden (siehe verlinkter Thread). Konkret waere es damit wohl:

Code: Alles auswählen

rename 's/aten/arten/' invasive*
Derartige Tools sind fast immer besser als solche Shellschleifen.
Use ed once in a while!

Cordess
Beiträge: 422
Registriert: 09.01.2006 00:37:22

Re: Dateinamen von mehreren Dateien in einer Schleife korrigieren

Beitrag von Cordess » 08.09.2023 07:54:59

Meillo hat geschrieben: ↑ zum Beitrag ↑
08.09.2023 07:38:53
Siehe auch viewtopic.php?t=177188

Ich mache sowas meist interaktiv mit emv im Editor:

Code: Alles auswählen

emv invasive*
dann geht bei mir der vi auf, in dem ich dann:

Code: Alles auswählen

:%s,aten,arten,
:wq
eingebe ... und fertig ist das Umbenennen :-)
Das klingt schon einmal gut, das dürfte sich insbesondere für Dateien anbieten, die sich nicht so einfach per Skript Befehl verarbeiten lassen, also sich im Namen sich bspw. beliebiger unterscheiden.
Allerdings scheint das Programm noch im Paketsystem zu fehlen.

Code: Alles auswählen

apt-file search emv | grep /usr/bin/emv
hat auf die schnelle jedenfalls kein sinnvolles Ergebnis gebracht.

Damit scheidet es für mich erst einmal aus. Ich bin bei Programmen, die ich nicht über das Paketsystem bekomme sehr zögerlich, da muss es dann schon einen sehr triftigen Grund geben, dass ich so etwas dann selber installiere. Immerhin ist so etwas mit einem gesteigerten Wartungsaufwand verbunden und sicherheitstechnisch kann es auch problematisch sein.

Die meisten wuerden wohl `rename' verwenden (siehe verlinkter Thread). Konkret waere es damit wohl:

Code: Alles auswählen

rename 's/aten/arten/' invasive*
Derartige Tools sind fast immer besser als solche Shellschleifen.
Da stimme ich zu. Ein einzelnen Programm dürfte performanter laufen, als unzählige aneinandergereihte Bash Befehle.

Benutzeravatar
spiralnebelverdreher
Beiträge: 1296
Registriert: 23.12.2005 22:29:03
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Frankfurt am Main

Re: Dateinamen von mehreren Dateien in einer Schleife korrigieren

Beitrag von spiralnebelverdreher » 08.09.2023 07:59:43

Cordess hat geschrieben: ↑ zum Beitrag ↑
08.09.2023 06:11:24
Ich habe eine Reihe von Bilddateien, die aus einem Gruppennamen gefolgt von einer Nummer bestehen.
Die Nummer ist bei jeder Datei verschieden, der Gruppenname ist immer gleich, allerdings falsch geschrieben.

Das wollte ich jetzt in einer Schleife korrigieren.
...

Das habe ich jetzt so gelöst, die Lösung funktioniert auch, aber ich frage mich, ob es dafür bessere Lösungen gibt?

Code: Alles auswählen

for FILE in invasive*; do awk 'FNR == 1{ print FILENAME }' $FILE | mv $FILE invasive_arten_`awk 'BEGIN {FS="_"} { print $3 }'`  ; done
Ich mache das mit Debianthunar (XFCE Dateimanager). Alle Dateien markieren, die umbenannt werden sollen, F2 drücken und es öffnet sich ein Dialogfeld, in dem du Zeichenketten suchen und ersetzen kannst.

Benutzeravatar
RootRat
Beiträge: 29
Registriert: 03.06.2016 06:37:12

Re: Dateinamen von mehreren Dateien in einer Schleife korrigieren

Beitrag von RootRat » 08.09.2023 08:18:38

Viele Wege fuehren nach Rom...
Einen hab ich auch noch:

Code: Alles auswählen

for i in *.png ; do mv $i invasive_arten_${i##*_} ; done
"Rename" und "Thunar" sind mir zu kompliziert 8O

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

Re: Dateinamen von mehreren Dateien in einer Schleife korrigieren

Beitrag von Meillo » 08.09.2023 08:31:05

Cordess hat geschrieben: ↑ zum Beitrag ↑
08.09.2023 07:54:59
Meillo hat geschrieben: ↑ zum Beitrag ↑
08.09.2023 07:38:53
Das klingt schon einmal gut, das dürfte sich insbesondere für Dateien anbieten, die sich nicht so einfach per Skript Befehl verarbeiten lassen, also sich im Namen sich bspw. beliebiger unterscheiden.
Allerdings scheint das Programm noch im Paketsystem zu fehlen.

Code: Alles auswählen

apt-file search emv | grep /usr/bin/emv
hat auf die schnelle jedenfalls kein sinnvolles Ergebnis gebracht.

Damit scheidet es für mich erst einmal aus. Ich bin bei Programmen, die ich nicht über das Paketsystem bekomme sehr zögerlich, da muss es dann schon einen sehr triftigen Grund geben, dass ich so etwas dann selber installiere. Immerhin ist so etwas mit einem gesteigerten Wartungsaufwand verbunden und sicherheitstechnisch kann es auch problematisch sein.
[/code]
Siehe dazu eggys Post im verlinkten Thread: viewtopic.php?t=177188#p1236590
vipe (aus den Debianmoreutils) arbeitet nach dem gleichen Prinzip.
Cordess hat geschrieben: ↑ zum Beitrag ↑
08.09.2023 07:54:59
Da stimme ich zu. Ein einzelnen Programm dürfte performanter laufen, als unzählige aneinandergereihte Bash Befehle.
Ich meine nicht die Performance, sondern die Robustheit. ;-)

Mit so einem Shellkonstrukt gibt es einfach zu viele Stelle, wo man genau aufpassen muss, dass man alles richtig macht. Es schuetzt auch nicht davor, dass z.B. der Zielname von allen Dateien gleich ist und sie sich alle ueberschreiben. 8O Auch kann man meist nachtraeglich nicht nachvollziehen was nun wie umbenannt worden ist. Wenn alles wie gewuenscht funktioniert hat, ist das wenig wichtig, aber wenn irgendwas schief geht, wird das ploetzlich wichtig.


Interessanterweise kommen Massenumbenennungen bei mir fast nur in der interaktiven Bedienung vor. In Scripten benenne ich meist nur einzelne Dateien um. Darum habe ich wenig Verwendung fuer `rename'. `emv' ist fuer mich im Alltag flexibler, weil ich sowohl mit s/// Suchen-Ersetzen kann als auch individuell nacharbeiten und eine Vorschau vom Ergebnis habe.
Use ed once in a while!

Cordess
Beiträge: 422
Registriert: 09.01.2006 00:37:22

Re: Dateinamen von mehreren Dateien in einer Schleife korrigieren

Beitrag von Cordess » 08.09.2023 08:47:41

Meillo hat geschrieben: ↑ zum Beitrag ↑
08.09.2023 08:31:05
Auch kann man meist nachtraeglich nicht nachvollziehen was nun wie umbenannt worden ist. Wenn alles wie gewuenscht funktioniert hat, ist das wenig wichtig, aber wenn irgendwas schief geht, wird das ploetzlich wichtig.
Verstehe und ich stimme dir in vielen Punkten zu.
Bei einer Reihe von Bashbefehlen, die in eine Zeile passen, mache ich das aber immer so, dass ich diejenigen, die gut funktionieren und ich öfters brauchen könnte, mir einfach in eine Textdatei notiere oder gleich ein Shell Skript daraus bastele. Daher kann ich immer nachschlagen, wenn ich ein bestimmte Aufgabe für eine bereits bekannte Lösung habe.

Außerdem habe ich mir angewöhnt, keine Leerzeichen oder außergewöhnliche Sonderzeichen in Dateinamen zu verwenden. Dadurch werden die Skripte dann wesentlich einfacher.
Darum habe ich wenig Verwendung fuer `rename'. `emv' ist fuer mich im Alltag flexibler, weil ich sowohl mit s/// Suchen-Ersetzen kann als auch individuell nacharbeiten und eine Vorschau vom Ergebnis habe.
Ja, kann ich nachvollziehen. Wenn es das mal ins Paketsystem schafft, werde ich es auch benutzen.

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

Re: Dateinamen von mehreren Dateien in einer Schleife korrigieren

Beitrag von tobo » 08.09.2023 10:03:45

Cordess hat geschrieben: ↑ zum Beitrag ↑
08.09.2023 08:47:41
Darum habe ich wenig Verwendung fuer `rename'. `emv' ist fuer mich im Alltag flexibler, weil ich sowohl mit s/// Suchen-Ersetzen kann als auch individuell nacharbeiten und eine Vorschau vom Ergebnis habe.
Ja, kann ich nachvollziehen.
Vorschau und Dokumentation bei rename:

Code: Alles auswählen

$ touch f1
$ rename -n 's/1/2/' f*
rename(f1, f2)
$ rename -v 's/1/2/' f*
f1 renamed as f2
$ rm f2
$

Antworten