2009-03-13 11 views
1

Ich möchte einige Dateien umbenennen, die alle im selben Verzeichnis befinden. Das verwendete Dateinamensmuster ist Prefix_ddmmyy.tex mit einem europäischen Datumsformat. Aus Gründen der Lesbarkeit und der Reihenfolge möchte ich die Dateien in einem Muster Prefix_yymmdd.tex mit einem kanonischen Datumsformat umbenennen.Wie Umbenennen von Dateien auf einer Datumsbasis in der Shell?

Wer Ideen, wie ich dies automatisch für ein komplettes Verzeichnis tun können? Mein sed und regexp Wissen ist nicht sehr scharf ...

+0

Ich habe immer gedacht, dass die "amerikanischen" Datumsformat war mmddyy. – innaM

+0

Ja, Amerikaner mmddyy, wheread yymmdd (oder eher yyyymmdd) ist kanonisch (vor allem im Gegensatz zu anderen Formaten, es sortiert tatsächlich richtig.) – vladr

+0

Ok Entschuldigung der Fehler. Dann nehme ich die kanonische Variante. Entsprechend bearbeitet. – boutta

Antwort

3

für Datei in Präfix _ * tex. do file_new = echo "$file" | sed -e 's:\([0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9]\)\(\.tex\):\3\2\1\4:' test "$ file"! = "$ file_new" & & mv -f "$ file" "file_new"

$ getan

Oder, wenn Sie viele Dateien und/oder wollen Prozessdateien rekursiv ersetzen:

for file in Prefix_*.tex ; do 

mit:

find . -name Prefix_*.tex -print | while read file ; do 

oder (nichtrekursive, GNU):

find . -maxtdepth 1 -name Prefix_*.tex -print | while read file ; do 
0

können Sie versuchen, "mmv".

1

Sie können es auch mit jedem bourne-Typ Shell ohne externe Befehle:

for f in *.tex; do 
    _s=.${f##*.} _f=${f%.*} _p=${f%_*}_ 
    _dt=${_f#$_p} _d=${_dt%????} _m=${_dt%??} 
    _y=${_dt#$_m} _m=${_m#??} 
    mv -- "$f" "$_p$_y$_m$_d$_s" 
done 

Mit zsh wäre es:

autoload -U zmv 
zmv '(*_)(??)(??)(??)(.tex)' '$1$4$3$2$5' 
+0

Ich verstehe die Lösung von Vlad, aber können Sie erklären, was Ihr Skript tut. Ich verstehe die Bindung der verschiedenen Variablen nicht. – boutta