# Daten mit bestimmter Endung kopieren (immer wenn neue dazu)

## icke007

Hallo

Ich möchte Alle Dateien aus einem Bestimmten Ordner mit der Dateiendung .xyz in einen anderen Ordner kopieren.

Das soll immer dann passieren, wenn eine neue Datei mit dieser Endung dazugekommen ist.

Das Problem ist jedoch, dass die Datei "vollgeschrieben" wird. Also am Anfang hat sie 1 KB und wird immer weiter beschrieben. Wenn sie fertig ist hat sie bis zu 15 MB. Ich möchte nun mit einem Script also feststellen, ob die Datei nicht mehr "beschrieben" wird und dann kopieren.

Ich denke ich mach das am Bestem mit Cron. Das kopieren bekomme ich auch noch hin. Nur wie kann ich prüfen, ob die Datei schon fertig ist?

----------

## manuels

Schau dir mal inotify an. Das kann man in mehreren Scriptsprachen nutzen und damit benachrichtigt werden wenn eine Datei z.B. "geschlossen" wird.

----------

## think4urs11

Ich behelfe mir in solchen Fällen immer eines trivial-Tricks.

- neue Dateien werden grundsätzlich erst in einem /foo/tmp-Ordner angelegt, beschrieben und irgendwann vollendet

- alle x Minuten werden Dateien von dort mit einem change-date älter x Min. nach /foo verschoben

Das sollte je nachdem wie deine Applikation arbeitet auch den Fall abfangen das eine Datei häppchenweise geschrieben wird (d.h. open, write chunk, close, open, ...) sofern x nur größer ist als die maximale Zeit zwischen solchen Pausen.

Ansonsten kannst du wenn es das Dateiformat hergibt ggf. auf eine Art 'Datei-Endecode' abprüfen. Also sowas wie 'am Ende der Datei steht immer </xml>' o.ä.

----------

## icke007

@Think4UrS11 kannst du mir bitte ein Beispiel geben, damit ich die Methode besser verstehe?

----------

## think4urs11

 *icke007 wrote:*   

> @Think4UrS11 kannst du mir bitte ein Beispiel geben, damit ich die Methode besser verstehe?

 

Angenommen du hast einen (S)FTP-Server auf den deine Kunden/Partner/Lieferanten Daten einliefern die automatisiert und möglichst zeitnah verarbeitet werden sollen.

Du kannst nicht verläßlich sagen wann Daten eingeliefert werden, wie lange die Übertragung dauert oder wie groß die Datei am Ende sein wird. Du weißt nur das die Verarbeitung so zeitnah wie möglich erfolgen muß.

Wir lösen das so das 'so einer' einen (S)FTP-Account bekommt mit Rootfolder /data/kunden-id/in/tmp.

Neue Daten werden also dort eingeliefert. Alle 15 Minuten grast nun ein Script diverse /data/*/in/tmp-Verzeichnisse ab. (15 Min. sind für uns absolut ausreichend, man kann natürlich auch auf ~2-3 Min. heruntergehen, noch kürzer wird es aber langsam etwas gefährlich)

Werden dort Daten gefunden _und_ deren Zeitstempel ist älter als 15 Minuten gehen wir davon aus das die Übertragung vollständig ist.

Die Daten werden dann von /data/kunden-id/in/tmp  nach /data/kunden-id/in verschoben, d.h. eine Ebene im Verzeichnisbaum nach oben.

Ein anderer Prozess grast parallel jede Minute die /data/*/in-Verzeichnisse ab und schiebt die gefundenen Daten zur weiteren Verarbeitung auf andere Systeme.

Läuft bei uns vollkommen schmerzfrei - wenn es Probleme gibt dann nur weil Übertragungen tatsächlich mal abgebrochen sind wg. Fehlern irgendwo im Internet oder beim Partner. (ca. 0.01%% aller Fälle)

Bei ganz kritischen Sachen kann man den Partner auch jeweils 2 Dateien übertragen lassen - einmal die Rohdaten und zum anderen eine sha1/md5-Prüfsumme. Nur wenn Prüfsumme und Rohdaten passen wird die Datei verschoben. Fehlt eine der beiden Dateien oder paßt die checksum nicht wird eine Mail an die zuständigen Leute verschickt.

Prinzipiell ähnlich läuft es bei ausgehenden Daten, wobei da teils wir pushen und teils die Partner selbst pullen.

Klingt nach Gebastel (ist es auch genaugenommen), funktioniert aber sehr gut und da leider nicht alle Partner etwas wie AS2 oder PM4Data o.ä. einsetzen war diese Lösung notwendig.

Da das ganze auf unterschiedlichen Systemen wie AIX, Linux, Solaris und hastenichgesehen läuft entfallen 'elegantere' Methoden leider mangels direkter Portabilität; die einzige gemeinsame Konstante ist ksh. (Geht natürlich auch mit bash)

----------

