2016-06-23 7 views
0

Ich habe eine Liste von Dateien von Anfang Juni bis heute, die willkürliche Namen mit dem Datum in ihnen haben.Bash-Skript zum Umbenennen der Datei in nur den Datum Teilstring im Dateinamen

Sie sind:

JUNE 13.pdf 

JUNE 16 MIDTERM REVIEW LAND GRABS 1 EXCLUSION AND BACKGROUND,.pdf 

LECTURE JUNE 21 RUBBER RIGHTS RESISTANCE.pdf 

SUMMER JUNE 15 TITLING AND LEGIBILITY.pdf 

SUMMER JUNE 22 LIVELIHOODS.pdf 

summer JUN 14 PROPERTY RIGHTS LECTURE.pdf 

Ich habe eine ganze Weile heute versuchen, den Fall von bash zu erhalten, aber in allen Lösungen, die ich geschaut haben bei wirklich komplizierte Syntax, die ich nicht verstehe. Ich weiß, dass Sie das Datum aus der Datei extrahieren und es entsprechend benennen können, aber ich möchte wirklich lernen, wie man Teilstrings mit bash extrahiert.

Die beste Lösung, die ich habe kommen mit hat sich von here

for j in *.pdf; 
do 
    length=`expr match "$j" 'JUN[E, ] ??'` 
    ind=`expr index "$j" 'JUN' ` 
    mv $j ${j:ind:length} 
done 

aber diese Lösung nur gibt mir viele Syntaxfehler ohne Angabe von dem, was ich falsch mache gefunden. Ich habe auch versucht, Schnitt, Umbenennen, einige andere "Standard" Zeug, aber ich habe wirklich Probleme.

+0

Wären Sie bereit, Python oder eine andere, mächtigere Sprache zu verwenden? –

+0

Wenn es eine ausführbare Shell-Befehl ist, dann ja, denke ich. – Jacob

+0

'expr match' ist eine verankerte Übereinstimmung: Sie wird nur dem Anfang einer Zeichenfolge entsprechen. –

Antwort

1

expr ist nützlich, aber wahrscheinlich nicht der einfachste Weg, dies zu tun. (Der Befehl match wird nur am Anfang der Zeichenfolge übereinstimmen.) Ich gehe davon aus, dass Sie das Datum für die Übereinstimmung mit einem Verzeichnis erhalten: Ändern Sie den Test nach Bedarf, wenn dies eine falsche Annahme ist. Versuchen Sie sed:

for i in *.pdf; do 
    d=$(echo "$i" | sed -E 's/.*(JUNE? [0-9]+).*/\1/'); 
    test -d "$d" && mv -i "$i" "$d" 
done 
+0

Dies ist die Antwort, nach der ich gesucht habe. Das einzige Problem ist, dass JUN nicht automatisch in JUNE umbenannt wird. – Jacob

+0

Außerdem entfernte es das .pdf aus den Dateien, die ich nicht bemerkte, aber ich fügte sie zurück. – Jacob

+0

Um JUN durch JUNI zu ersetzen, könnten Sie 'sed -E /.* JUNE verwenden? * ([0-9] +). */JUNI \ 1/'' –

1

Ich würde Python verwenden:

#!/usr/bin/env python 

import os 
import re 
import sys 

regex = re.compile('.*(JAN|FEB|MAR|APR|MAY|JUNE?|JULY?|AUG|SEP|OCT|NOV|DEC) (\d+).*(\.\w+)$') 

for filename in sys.argv[1:]: 
    matches = regex.match(filename) 
    if matches: 
     newname = ''.join(matches.groups()) 
     print "rename -", filename, "- to -", newname 
     #os.rename(filename, newname) 

Kommentar- der letzten Zeile, wenn Sie es getestet haben und die gedruckten Ergebnisse zu sehen sind, was Sie wollen.

+0

Das ist eine gute Antwort, es wies mich auf eine leistungsfähigere Toolbox hin, von der ich nichts wusste, aber ich werde morgen etwas über diese Syntax lesen müssen, um es zu verstehen. – Jacob