2016-04-10 11 views
0

Ich habe rund 500 Dateien, die ich umbenennen muss mit dem Datum, das der Bericht darstellt. Die Dateinamen sind derzeit:Bash - Dateiname ändern Datum + 1

WUSR1453722998383.csv 
WUSR1453723010659.csv 
WUSR1453723023497.csv 

Und so weiter. Die Zahlen im Dateinamen haben nichts mit dem Datum zu tun, daher kann ich den Dateinamen nicht als Anhaltspunkt für die Umbenennung der Datei verwenden. Die Berichte beginnen am 02.12.2014 und es gibt einen Bericht für jeden Tag des Monats bis gestern (09.04.2016). Zum Glück ist auch der Dateiname sequenziell - so 04/12/2014 wird eine höhere Nummer als 03/12/2014 haben, die eine höhere Nummer als 02/12/2014 haben wird. Dies bedeutet, dass die Dateien automatisch in alphabetischer Reihenfolge aufgelistet werden.

Es gibt jedoch ein Datum in der ersten Zeile der CSV, bevor die Daten:

As at Date,2014-12-02 

Jetzt habe ich überprüft, dass ich alle Dateien bereits und ich, so was ist der beste Weg, um zu umbenennen Da zum Datum? Ich kann entweder das Startdatum als 02/12/2014 festlegen und jede Datei als +1 Datum benennen oder das Skript kann das Datum in der ersten Zeile der Datei (As at Date,2014-12-02 zum Beispiel) lesen und dieses Datum verwenden, um die Datei umzubenennen.

Ich habe keine Ahnung, wie Sie eine der oben genannten Methoden in bash schreiben, also wenn Sie mit diesem heraushelfen könnten, würde das wirklich geschätzt werden.

In Bezug auf die Dateiausgabe, ich hatte gehofft, für:

02-12-2014.csv 03-12-2014.csv

Und so weiter

+0

Willkommen bei Stack Overflow. Bitte lesen Sie die [Über] Seite bald. Möchten Sie, dass die Dateien immer noch in der Datumsreihenfolge aufgelistet werden? Wenn Sie also die Namen 'WUSR-2014-02-12.csv' (oder vielleicht' WUSR-20140212.csv') verwenden, erhalten Sie das Datum im Namen? Sie sollten die gewünschte Ausgabe (endgültige Dateinamen) zu Ihrer Frage hinzufügen (Sie können Ihre Frage bearbeiten). Brauchst du die Originalnummer erhalten? Wie haben Sie überprüft, dass Sie alle Dateien haben? Was immer Sie getan haben, sollte Ihnen eine Idee geben, wie Sie die benötigten Informationen in einem Shell-Skript erhalten. Was hast du probiert? –

+0

Ich habe verwendet: head -q -n 1 * .csv> output.csv, um zu überprüfen, dass ich die ganze Datei habe (Ich habe die Ausgabe-CSV und abgestimmt es für jedes Datum von 02/12/2014 bis gestern und sie sind alle dort). Ich nehme an, dass ich sowas auch für die Dateiumbenennung verwenden kann (wo es die erste Zeile jeder CSV-Datei nimmt und das Datum dort verwendet, um die Datei umzubenennen), ich weiß einfach nicht, wie genau ich alles zusammenbinden soll. .. –

+0

Ich verstehe nie, warum Leute die bestellten Dateien so mögen, dass Dateien vom 14. Februar 2014 bis zum 14. Feb. 2015 und 14. Feb. 2016, dann 15. Feb. 2014, 15. Feb. 2015, 15. Feb. 2016 etc. Es ist jedoch ein häufiges Problem - es muss einen Grund geben, warum, aber ich bin mir sicher, dass es hauptsächlich unterbewusst ist. –

Antwort

1

Ist das die Antwort, die Sie brauchen? Angenommen, alle Dateien befinden sich im aktuellen Verzeichnis. Führen Sie einige Tests durch, bevor Sie die eigentliche Operation durchführen. Die Bedingung ist, dass jede Datumszeichenkette in Ihrer cvs-Datei eindeutig ist. Einige Dateien werden sonst überschrieben.

#!/bin/bash 
for f in *.csv 
do 
    o=$(sed '1q' $f |awk -F"[,-]" '{print $NF"-"$(NF-1)"-"$(NF-2)".csv"}') 
    # should we backup the file? 
    # cp $f ${f}.bak 
    mv $f $o 
done 
+0

Legende, danke. –