Ich habe die Namen der Datendateien in chronologischer Reihenfolge:
FileName_YYYY_MM_DD_HHMM.dat
Gibt es Befehle zum Hinzufügen von 30 Minuten zu jedem Zeitstempel?
command-line
filename
timestamp
Erdbeere
quelle
quelle
ls --full-time
?Antworten:
Verwenden von
python
:os.chdir('/path/to/dir')
ändert das aktuelle Verzeichnis in das Verzeichnis, das die.dat
Dateien enthält. Durch/path/to/dir
den tatsächlichen Pfad ersetzen .glob.glob('*.dat')
findet die Dateien, die auf enden.dat
ini_time
Die Variable schneidet zunächst mithilfe desre
Moduls die Datums- und Uhrzeitangabe aus dem ursprünglichen Dateinamen aus und sortiert dann aus, welcher Eintrag was in der herausgenommenen Zeichenfolge darstellt, damit wir die erforderliche Zeit hinzufügen könnenfin_time
enthält die resultierende Zeit, dhini_time
plus 30 Minutenos.rename
benennt die Datei entsprechend um.Beachten Sie auch, dass bei aufeinanderfolgenden Dateinamen (die sich um 30 Minuten unterscheiden) die umbenannte Datei die nächste überschreibt. Daher ist es besser, die Sekunden zum umbenannten Dateinamen hinzuzufügen, damit sie sicher bleibt. Andernfalls müssen Sie die umbenannten Dateien in einem anderen Verzeichnis speichern und später durch die ursprünglichen ersetzen.
quelle
Filename_
in der Umbenennungsmethode verwenden./path/to/file
durch den vollständigen Pfad zum Verzeichnis ersetzt?Mit
bash
werden die umbenannten Dateien in einem neuen Unterordner gespeichertrenamed
.Starten Sie das Skript in dem Ordner, in dem sich die Dateien befinden.
Beispielausgabe:
quelle
renamed
FileName_123.Data_YYYY_MM_DD_HHMM.dat
das Teil.Data_YYYY_MM_DD_HHMM.dat
die Erweiterung. Und ist daherFileName_123
kein gültiger Zeitstempel.SKRIPT
Dies ist die bearbeitete Version meines ursprünglichen Skripts. OP lieferte ursprünglich keine vollständigen Informationen zum Namensformat. Dieses Skript passt sich an das in den Kommentaren erwähnte OP an, das die korrekte Benennung der Datei war.
* Technische Hinweise: *
In diesem Skript trennen wir den Dateinamen mit awk in 6 separate Felder, wobei der Unterstrich als Feldtrennzeichen dient. Die ersten beiden Felder $ 1 und $ 2 werden als statische Textzeichenfolge betrachtet. Die Felder 3,4,5 und 6 sind der Zeitstempel, zu dem die OP-Daten abgetastet wurden, nicht das Erstellungsdatum der Datei im Dateisystem.
Die Variable COPYDIR enthält den Namen des neuen Verzeichnisses, in das Dateien mit aktualisiertem Zeitstempel verschoben werden. Wir erstellen dieses Verzeichnis im aktuellen Arbeitsverzeichnis mit
mkdir $COPYDIR
Die Variablen TEXTSTRING und DATESTRING enthalten jeweils statischen Text und Zeitstempel. In der Beispielausgabe unten habe ich zwei verschiedene Zeichenfolgen verwendet, um zu beweisen, dass das Skript funktioniert, unabhängig davon, welchen Text die ersten beiden Felder enthalten.
NEWEPOCHTIME ist eine Variable, die berechneten neuen Zeitstempel im Unix-Epochenformat enthält. NEWDATE ist eine Variable, die den konvertierten Zeitstempel von der Unix-Epoche in das Format JJJJ-MM-TT HH: MM enthält. NEWAPPEND ist der tatsächliche Zeitstempel, der der Datei im gewünschten OP-Format JJJJ_MM_TT_HHMM hinzugefügt wird.
cp $file "$COPYDIR"/"%TEXTSTRING""$NEWAPPEND".dat
kopiert die alte Datei mit dem aktualisierten Datenstempel in das Verzeichnis "convert_files" (anstatt sie zu verschieben, um Datenverlust zu vermeiden).Beachten Sie , dass das Skript funktioniert, solange das Namensformat wirklich eingehalten wird, dh alle Dateien haben wirklich das
SomeText_123.Data_YYYY_MM_DD_HHMM.dat
Format.SCRIPT IN AKTION
Der Demonstrationsbalg ist eine direkte Kopie von meinem Terminal. Beachten Sie, dass ich in den ersten beiden Feldern Originaldateien mit zwei verschiedenen Zeichenfolgen erstellt habe. Dieses Skript sollte also funktionieren, egal was am Anfang des Dateinamens steht, solange es wirklich nur zwei durch Unterstriche getrennte Zeichenfolgen gibt
Das Skript wurde benannt,
notes-conversion
weil ich das Skript aus den Notizen entwickelt habe, die ich während der Arbeit an dieser Frage gemacht habe.Beachten Sie, dass Dateinamen mit dem HHMM-Teil 2345 (15 Minuten vor Mitternacht) auf 0015 und der DD-Teil auf den nächsten Tag aktualisiert werden. 24-Stunden-Format erhalten.
Da for loop nur nach
.dat
Dateien sucht , vermeiden wir außerdem das Umbenennen anderer Dateien oder Verzeichnisse, die sich möglicherweise im Arbeitsverzeichnis befinden, und vermeiden so potenziellen Datenverlust. Im folgenden Beispiel enthält das Originalverzeichnis 11 Elemente, von denen 3*.txt
Dateien zum Testen sind. Daher arbeiten wir nur mit 8.dat
Dateien. In dem Verzeichnis, in das aktualisierte Dateien verschoben werden, werden 8 Dateien angezeigt, alle.dat
und keine anderen Dateien. Daten sind sicher, Skript macht seinen Job.ERKLÄRUNG (vom ursprünglichen Beitrag)
*) Heute habe ich erfahren, dass Unix-Linux-Systeme die Zeit in der Epoche zählen oder einfach Sekunden eingeben.
*) Das Skript nimmt jeden Dateinamen, extrahiert das Datum, konvertiert es in eine Epoche, fügt 1800 Sekunden hinzu (was genau 30 Minuten entspricht) und speichert die Datei mit einem neuen Zeitstempel.
*) Dieses Skript adressiert, was OP wollte - ändern Sie den Zeitstempel im Dateinamen, nicht die Erstellungszeit der Datei selbst
Benutztes Werkzeug:
Ubuntu 15.04
GNU Bash 4.3.30
GNU awk 4.1.1
Datum (GNU Coreutils) 8.23
quelle
find
Befehle, was auch gut ist.Sie können diesen Code verwenden, um das zu tun, was Sie benötigen
Der Code lautet:
So funktioniert es: Der Code überprüft den Minutenteil im Dateinamen.
MM
Wenn er kleiner als 30 ist, addiert er 30 zu dem,MM
wenn er 30 oder mehr entspricht, addiert er 1 Stunde zu demHH
Teil im Namen und zieht 30 Minuten von dem abMM
Teil des Namensquelle