Einfaches Shellscript - dateinamen ändern

S

schubidooo

Grünschnabel
Hey, kann mir jemand vielleicht bei diesem miniscript helfen?

ich habe dateien die folgendermaßen aussehen

MM-DD-YY-dateiname und
MM-DD-YYYY-dateiname

ich möchte es gerne vereinheitlichen zu

YYYY-MM-DD-dateiname

zur not auch nacheinander. die YY angaben sind nur im 20xx bereich.
-----------------

ein pseudoscript:

a) speichere alle zeichen zwischen dem zweiten und dritten "-" in $temp
b) füge "20" + die letzten beiden zeichen von $temp + "-" vorne an den dateinamen an
c) lösche alle zeichen zwischen dritten und vierten "-"

nur habe ich leider keine ahnung wie ich ein funktionierendes script baue.
 
Ohne Gewähr:
Code:
#!/bin/bash
find -maxdepth 1 -type f -name "[0-9][0-9]-[0-9][0-9]-[0-9][0-9]*" | while read Line; do
    Line="${Line#./}"
    IFS='-' Array=($Line)
    [ ${#Array[2]} = 2 ] && Array[2]="20${Array[2]}"
    mv -v "$Line" "${Array[2]}-${Array[0]}-${Array[1]}-${Line#[0-9]*-[0-9]*-[0-9]*-}"
done
 
vielen dank! hatte mich inzwischen selbst ein bisschen eingelesen und das hier produziert

Code:
for filename in *
do

neu=$(echo $filename)

ch6=$(echo $filename|cut -c6-6)
ch9=$(echo $filename|cut -c9-9)
ch11=$(echo $filename|cut -c11-11)

#TYP A: MM-DD-dateiname -> YYYY-MM-DD-dateiname
if [ "$ch9" != "-" ] && [ "$ch11" != "-" ] 
	then 
	jahr=$(echo 2011)
	rest=$(echo $filename)
	neu=$(echo $jahr-$filename)
fi 

#TYP B: MM-DD-YY-dateiname -> YYYY-MM-DD-dateiname
if [ "$ch9" = "-" ] 
	then 
	jahr=$(echo  $filename|cut -c7-8)
	rest=$(echo $filename|cut -c1-6,10-)
	neu=$(echo 20$jahr-$rest)
fi 

#TYP C: MM-DD-YYYY-dateiname -> YYYY-MM-DD-dateiname
if [ "$ch11" = "-" ] && [ "$ch6" == "-" ] 
	then 
	jahr=$(echo  $filename|cut -c7-10)
	rest=$(echo $filename|cut -c1-6,12-)
	neu=$(echo $jahr-$rest)
fi 


mv $filename $neu


done


etwas uneleganter und länger als deins^^


eine frage hätte ich noch: wie kann man .sh scripte unter windows ausführen? ich bin auf cygwin, windows services for unix und MinGW gestoßen. irgendwelche empfehlungen?
 
sowohl cygwin als auch mingw stellen die bash bereit. Mir persoenlich gefaellt cygwin besser als mingw.
 
Wenn schon Perl installiert ist (zu 99% der Fall):
Unter Perl gibt es ein Wrapperscript das (Perls) reguläre Ausdrücke auf Dateinamen anwendet um sie umzubenennen, das Script hat den passenden Namen rename. Man übergibt ihm nur den regulären Ausdruck und den/die Dateiname(n). Es arbeitet nur im jeweiligen Verzeichnis, soll es rekursiv sein, bastelt man ein bashscript das durch die Verz. iteriert.
Mit Parameter -n kann man testen was es macht ohne dass es die Aktion wirklich durchführt.

Für Dateien mit MM-DD-YYYY-dateiname:
rename 's/(\d\d)-(\d\d)-(\d\d\d\d)-(.*)/${3}-${1}-${2}-${4}/' ./*

Für Dateien mit MM-DD-YY-dateiname:
rename 's/(\d\d)-(\d\d)-(\d\d)-(.*)/20${3}-${1}-${2}-${4}/' ./*

Statt mehrfach \d's zu schreiben geht auch \d{4} für 4 \d's
 
Zurück
Oben