[gelöst] Script um Zahlen zu trennen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Pa D.
Beiträge: 285
Registriert: 17.04.2004 19:56:09

[gelöst] Script um Zahlen zu trennen

Beitrag von Pa D. » 26.07.2010 11:28:21

Hi
Ich habe folgendes Problem

Dateiname ist z.B. 20100716181032_MD.avi
Werden soll daraus 2010_07_16_18:10:32_MD.avi
Die Dateien sollen per wget vom Server geholt und dann möchte ich das automatisch umbennen.
Hat da jemand ein paar Anregungen wie mensch das umsetzen könnte?
Danke schonmal.

Gruss
Dirk
Zuletzt geändert von Pa D. am 31.01.2011 12:33:09, insgesamt 1-mal geändert.

gxyz
Beiträge: 202
Registriert: 26.07.2010 13:54:21
Lizenz eigener Beiträge: MIT Lizenz

Re: Script um Zahlen zu trennen

Beitrag von gxyz » 26.07.2010 14:09:05

Code: Alles auswählen

for f in 20[0-9][0-9]*_MD.avi; do mv $f `echo $f | sed \
's/\(....\)\(..\)\(..\)\(..\)\(..\)\(..\)_MD.avi/'\
'\1_\2_\3_\4:\5:\6_MD.avi/'`
done
(Man kann's auch lesbarer formatieren - ich wollte nur verhindern, dass die Foren-Software an den falschen Stellen die Zeilen umbricht ... ;)

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

Re: Script um Zahlen zu trennen

Beitrag von Meillo » 26.07.2010 14:47:04

Gut.

Ich fürchte, ich kann's nicht toppen. ;-)
Use ed once in a while!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: Script um Zahlen zu trennen

Beitrag von gms » 26.07.2010 15:13:59

rename ist sehr angenehm für solche Einsätze:

Code: Alles auswählen

gms@gms2:~$ touch 20100716181032_MD.avi
gms@gms2:~$ rename 's/^(\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)/$1_$2_$3_$4:$5:$6/' *.avi
gms@gms2:~$ ls *.avi
2010_07_16_18:10:32_MD.avi
Gruß
gms

Benutzeravatar
mistersixt
Beiträge: 6601
Registriert: 24.09.2003 14:33:25
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Script um Zahlen zu trennen

Beitrag von mistersixt » 26.07.2010 15:24:07

Meillo hat geschrieben:Gut.

Ich fürchte, ich kann's nicht toppen. ;-)
http://www.dem-gxyz-seine-sed-zeile-is- ... -yours.com ;) !

Gruss, mistersixt.
--
System: Debian Bookworm, 6.11.x.-x-amd64, ext4, AMD Ryzen 7 3700X, 8 x 3.8 Ghz., Radeon RX 5700 XT, 32 GB Ram, XFCE

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

Re: Script um Zahlen zu trennen

Beitrag von Meillo » 26.07.2010 17:35:27

mistersixt hat geschrieben:
Meillo hat geschrieben:Gut.

Ich fürchte, ich kann's nicht toppen. ;-)
http://www.dem-gxyz-seine-sed-zeile-is- ... -yours.com ;) !
Ich fürchte nur, es ist anders rum, denn länger (meist gleichbedeutend mit umständlicher) ist bei sed nicht das Problem. Kurz, knackig, prägnant, das ist die Kunst. Bei sed freut sich also meist der mit dem kürzesten Schwanz.


Nachdem gms nun rename eingeworfen hat, ist mein Favorit:

Code: Alles auswählen

$ rename 's/^(....)(..)(..)(..)(..)(..)/$1_$2_$3_$4:$5:$6/' *_MD.avi
Auch wenn der Punkt nicht so genau wie \d ist, macht er die Sache deutlich übersichtlicher. Wir nehmen einfach an, dass alle Dateien die auf `_MD.avi' aufhören vorne einen Zeitstempel in erwarteter Form haben. ;-)
Use ed once in a while!

Pa D.
Beiträge: 285
Registriert: 17.04.2004 19:56:09

Re: Script um Zahlen zu trennen

Beitrag von Pa D. » 26.07.2010 19:33:56

gxyz hat geschrieben:

Code: Alles auswählen

for f in 20[0-9][0-9]*_MD.avi; do mv $f `echo $f | sed \
's/\(....\)\(..\)\(..\)\(..\)\(..\)\(..\)_MD.avi/'\
'\1_\2_\3_\4:\5:\6_MD.avi/'`
done
(Man kann's auch lesbarer formatieren - ich wollte nur verhindern, dass die Foren-Software an den falschen Stellen die Zeilen umbricht ... ;)

Perfekt, genau so wollte ich das.
Danke nochmal.
Jetzt brauch ich noch 2 Wochen zum verstehen :roll:

Ich gehe mal davon aus das bei der ersten sed Zeile in Zeichengruppen von 4 bzw 2 Zeichen Länge zerlegt wird und bei der nächsten die Gruppen aufgerufen werden.
Seh ich das so ungefähr richtig?

gxyz
Beiträge: 202
Registriert: 26.07.2010 13:54:21
Lizenz eigener Beiträge: MIT Lizenz

Re: Script um Zahlen zu trennen

Beitrag von gxyz » 27.07.2010 08:38:00

Pa D. hat geschrieben:
Ich gehe mal davon aus das bei der ersten sed Zeile in Zeichengruppen von 4 bzw 2 Zeichen Länge zerlegt wird und bei der nächsten die Gruppen aufgerufen werden.
Seh ich das so ungefähr richtig?
Genau das (wobei der Punkt für ein beliebiges Zeichen steht und nur durch das Glob-Muster in der for-Schleife festgelegt wird, dass der Dateiname mit 4 Ziffern beginnen muss; ach ja, Vorsicht: Das Pattern hat ein "Jahr-2100-Problem" ;-)

gxyz
Beiträge: 202
Registriert: 26.07.2010 13:54:21
Lizenz eigener Beiträge: MIT Lizenz

Re: Script um Zahlen zu trennen

Beitrag von gxyz » 28.07.2010 10:17:27

Meillo hat geschrieben: Ich fürchte nur, es ist anders rum, denn länger (meist gleichbedeutend mit umständlicher) ist bei sed nicht das Problem. Kurz, knackig, prägnant, das ist die Kunst. Bei sed freut sich also meist der mit dem kürzesten Schwanz.
... wobei allerdings der sed-Ausdruck haupsächlich deswegen abchreckend aussieht, weil dort gruppierende Klammern gequotet werden müssen - ansonsten läßt sich mit sed abgesehen von dem redundanten '_MD.avi' am Ende vermutlich nichts mehr einsparen.

Wenn auch Perl erlaubt ist, wäre das hier mein Beitrag zum 'Wer-hat-den-Kürzesten'-Wettbewerb ;-)

Code: Alles auswählen

rename 's/^@{[q((..))x7]}/$1$2_$3_$4_$5:$6:$7/' *_MD.avi
wobei's sogar noch etwas präziser und mit noch mehr Sonderzeichen geht:

Code: Alles auswählen

rename 's/^@{[q((\d{2}))x7]}/$1$2_$3_$4_$5:$6:$7/' *_MD.avi
(für den 'Obfuscated-Perl-Contest' reicht's noch nicht, aber die Richtung stimmt ;-)

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

Re: Script um Zahlen zu trennen

Beitrag von Meillo » 28.07.2010 10:52:31

gxyz hat geschrieben: Wenn auch Perl erlaubt ist, wäre das hier mein Beitrag zum 'Wer-hat-den-Kürzesten'-Wettbewerb ;-)

Code: Alles auswählen

rename 's/^@{[q((..))x7]}/$1$2_$3_$4_$5:$6:$7/' *_MD.avi
Nett und kreativ. :THX:
Use ed once in a while!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: Script um Zahlen zu trennen

Beitrag von Duff » 28.07.2010 10:54:21

Nicht schlecht. Diese Variante in perl kannte ich noch nicht.

Verständnisfrage:
Durch das @{[...]} wird alles in einem Array gespeichert und durch das q(..) gequotet. Die innere (..) Klammer speichert durch die . Punkte 2 beliebige Zeichenfolgen. Mit x7 wird festgelegt, dass später auf 7 Variablen zugegriffen werden kann bzw. nur bis zu 7 Werte-Paare im Array gespeichert werden sollen.
Oh, yeah!

gxyz
Beiträge: 202
Registriert: 26.07.2010 13:54:21
Lizenz eigener Beiträge: MIT Lizenz

Re: Script um Zahlen zu trennen

Beitrag von gxyz » 28.07.2010 11:16:17

Duff hat geschrieben: Mit x7 wird festgelegt, dass später auf 7 Variablen zugegriffen werden kann bzw. nur bis zu 7 Werte-Paare im Array gespeichert werden sollen.
Nicht ganz: "q((..))x7" (weil man sonst wegen der shell wieder haufenweise Zeug quoten müsste, geht "'(..)'x7" nicht so ohne weiteres - schade, wäre ein Zeichen weniger;) - ist einfach nur eine andere Möglichkeit, um ziemlich hinterrücks '(..)(..)(..)(..)(..)(..)(..)' zu schreiben - abgesehen davon, daß das Ganze so ein paar Zeichen kürzer und optisch spketakulärer ist, im Prinzip also das Gleiche wie bei den anderen Lösungsvorschlägen ...

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

Re: Script um Zahlen zu trennen

Beitrag von Meillo » 28.07.2010 11:47:03

Noch zwei Zeichen kürzer: ;-)

Code: Alles auswählen

rename 's/@{["(..)"x7]}/$1$2_$3_$4_$5:$6:$7/' *_MD.avi
Man kann mit Double-Quotes statt q() verwenden, und den Zeilenanfangsanker kann man weglassen weil immer der frühste, längst Match genommen wird, und die Punkte passen immer am Anfang.
Use ed once in a while!

gxyz
Beiträge: 202
Registriert: 26.07.2010 13:54:21
Lizenz eigener Beiträge: MIT Lizenz

Re: Script um Zahlen zu trennen

Beitrag von gxyz » 28.07.2010 12:25:11

Meillo hat geschrieben:Noch zwei Zeichen kürzer: ;-)
Gratuliere - eindeutig der Kürzeste ;-)

Immerhin lassen sich im gleichen Stil in dem ursprünglichen Shell/sed-Beispiel doch noch mehrere Anschläge einsparen:

Code: Alles auswählen

d='\(..\)'; for f in *_MD.avi; do mv $f `echo $f |
sed "s/$d$d$d$d$d$d$d/"'\1\2_\3_\4_\5:\6:\7/'`; done

Antworten