Wie kann ich eine Datei basierend auf einem Teildateinamen von einem Remote-Content abrufen?

1

Ich habe einige Unterordner (A, B, C, D ..) auf einem Remote-Server, der ungefähr 100.gz-Dateien enthält. Das Benennungsmuster für Dateien ist wie folgt: ND2_58_20151105173030_20151105173240_1234.log.gz Dabei ist das dritte und vierte Feld nach _ die Start- und Endzeit. Wenn nun die Start- / Endzeit 15 Minuten von der aktuellen Zeit entfernt ist, möchte ich diese Datei abrufen. Kann mir jemand vorschlagen, wie ich es mit Shell-Skript mache. Zum Abrufen von Daten verwende ich rsync.

Danke, Arn

Arn
quelle
Könnten Sie bitte den Befehl rsync freigeben? Verschleiern Sie vertrauliche Daten, falls vorhanden.
Samstag,
Ab sofort verwende ich das 'rsync -avhe "ssh -p $ portno" --exclude = "/ D / * / data1" --exclude-from = "$ FileNameList" --progress --log-file = " $ LogFullPath "$ User \ @ $ ServerIP: $ FolderPath1 $ InputFolderPath1". Es enthält jedoch nicht die erforderliche Logik. Ich kann die Start- / Endzeit mit dem folgenden Befehl ermitteln: cd ~ / Downloads / development / 20151101 find -maxdepth 2 -name "* .gz" | awk -F _ '{print $ 3}' >> $ {LogFullPath}. Ich kann jedoch nach dem Vergleich mit dem aktuellen Zeitstempel keine Dateien abrufen, die auf der Startzeit basieren.
Arn
In awkbesser print $3,$4, $0so , wenn Sie analysieren werden Sie den vollständigen Namen in der zweiten Spalte bereit haben. Sie brauchen $4auch, wenn es vor langer Zeit begann und erst vor wenigen Minuten endete ...
Hastur
Danke Hastur, ja, du hast recht. Ich muss sowohl die Start- als auch die Endzeit berücksichtigen. Aber soll ich sie nach dem Abrufen der Start- und Endzeit in eine Protokolldatei einfügen und sie dann mit dem aktuellen Zeitstempel vergleichen? Wie bereits erwähnt, gibt es ungefähr 10 Unterordner, die jeweils ungefähr 200 Dateien enthalten und diese Dateien in der gleichen Struktur des Remote-Servers auf den lokalen Server abrufen müssen. Außerdem sollte der gesamte Abruf innerhalb von maximal 3 Minuten abgeschlossen sein.
Arn
Mach ein kleines Drehbuch. Sobald Sie eine Liste von Dateien / Pfaden erstellt haben, können Sie diese innerhalb weniger Sekunden analysieren. In bash einmal setzen Sie einen Dateinamen ( nicht vergessen basename) in einer Variablen, zum Beispiel fnamemit a=${fname#*_*_}Ihnen wählen 20151105173030_20151105173240_1234.log.gzmit b=${a%_*_*}Ihnen verkleinern 20151105173030mit year=${b:0:4}Sie haben 2015und so weiter ... Natürlich können Sie mehr gemütliche Art und Weise ... finden Bash String - Manipulation
Hastur

Antworten:

1

Mit den Optionen --includeund --excludekönnen rsyncSie nur die gewünschten Dateien auswählen. Wenn ich Ihre Frage richtig verstehe, möchten Sie die Dateien, deren Name das aktuelle Datum / die aktuelle Uhrzeit plus oder minus 15 Minuten enthält. Ich bin mir nicht sicher, ob Sie genau 15 Minuten brauchen , aber hier ist ein kleines Skript, das dies tun kann:

#!/bin/sh

format='%Y%m%d%H%M'

for delta in $(seq -15 15); do
    p='--include=*_'$(date +$format --date "+ $delta minutes")'*_*.gz'
    include="$include $p"
done

rsync -av $include --exclude=* SRC/ DEST/

Sollte für genau 15 Minuten leicht zu ändern sein .

Gogatoren
quelle
Ja, Kevin, du hast recht. Ich muss nur die Daten abrufen, die eine Startzeit <15 Minuten vom aktuellen Zeitstempel enthalten. Hinzu kommt, dass ich diese Dateien aus mehreren Unterordnern holen muss und die Struktur des Quellzielordners ebenfalls synchron sein sollte. Ich werde Ihren Code verwenden. Nochmals vielen Dank.
Arn
Hallo Kevin, ich versuche, Ihren Code zu verwenden. Die gewünschten Dateien, die in den letzten 15 Minuten generiert wurden, können jedoch nicht berücksichtigt werden. format = '% Y% m% d% H% M' für Delta in $ (seq -15 0); do p = '- include = " _' $ (Datum + $ Format - Datum" + $ Delta Minuten ") ' _ .sig.gz"' include = "$ include $ p" done rsync -avhe "ssh - p $ portno "--exclude-from =" $ Et "$ include --exclude =" "--progress --log-file =" $ LogFullPath "$ S1User \ @ $ S1IP: $ S1FP1 $ InpFP1.Ich versuche es zum Abrufen von .sig.gz-Dateien vom Pfad ND / B1 / a1 des Remote-Servers (NE7_08_20151108082030_20151108082100_1.sig.gz) und zum Replizieren derselben auf dem lokalen Server.
Arn
Sie müssen die Platzhalter hinzufügen *zu includeund excludeOptionen , wie in meiner Antwort. p='--include="*_'$(date +$format --date "+ $delta minutes")'*_*.sig.gz"'und --exclude='*'ich weiß es auch nicht $Et, aber es sollte eine datei mit einer liste von ausschlussmustern sein.
Gogators
Hallo Kevin, ich verwende denselben Platzhalter, den Sie erwähnt haben. Irgendwie wird er hier nicht wiedergegeben. Ja, wie Sie sagten, enthält "$ Et" eine Liste von Unterordnern, die zum Zeitpunkt des Abrufs von Daten ausgeschlossen werden sollten, und funktioniert einwandfrei. Aber wenn ich $ include und --exclude = " " hinzufüge , wird nichts abgerufen. Aber jetzt kann ich das Problem verstehen. Da ich exclude = " " erwähne, werden die Verzeichnisse ignoriert und es wird nicht versucht, den Inhalt / die Benennung zu überprüfen Muster. Jetzt habe ich include = "* /" hinzugefügt, um die Verzeichnisse einzuschließen, und es hat funktioniert. Vielen Dank für Ihre wertvollen Beiträge. .
Arn
0

Wenn Sie den Daten aus dem Dateisystem vertrauen können, können Sie findund rsynczusammen.

find /path -file -mmin +15 -exec rsync {} destination \;

oder mit einer umgekehrten Logik und nur einem rsyncProzess

rsync --files-from=<(find /path -mmin +3 -type f -exec basename {} \;) /src_path/ /dst_path

Referenz

Sie können einen Blick auf diese [Antworten] [ 1 , 2 , 3 ] werfen , zum Beispiel ...

Hastur
quelle
Vielen Dank an Hastur für Ihre schnelle Antwort. Das Problem ist aber, dass ich die 15 Minuten früheren Daten basierend auf dem Zeitstempel nicht berücksichtigen kann. In einigen Szenarien kann sich der Zeitstempel der Datei von der Start- / Endzeit unterscheiden. Also muss ich den Teildateinamen (Endzeit / Startzeit) mit der aktuellen TS vergleichen und diese Datei dann vom Remote-Server abrufen.
Arn
Bitte. So sollten Sie versuchen , eine tun DRY Lauf von rsync -neinem einfachen, oder besser ssh ls /my/src_path, die Ausgabe zu analysieren, sed , wo sed 's/_/ /g'erforderlich, erstellen Sie eine Liste, Filter (vielleicht awk oder Bash String - Ersetzung) und ein zweites Mal laufen rsyncmit , dass ein.
Hastur