Eine Datei wird nacheinander von heruntergeladen wget
.
Wenn ich mit dem Auspacken beginne cat myfile.tar.bz2 | tar -xj
, kann es mit "Unexpected EOF" richtig entpacken oder fehlschlagen, je nachdem, was schneller ist.
Wie man eine Datei "cat and follow" macht, dh den Inhalt der Datei auf stdout ausgibt, aber nicht auf EOF beendet, stattdessen diese Datei abonniert hält und weiterhin neue Teile der Daten ausgibt und nur dann beendet, wenn die Datei durch geschlossen wird Schreiber und nicht innerhalb von N Sekunden wieder geöffnet.
Ich habe ein Skript cat_and_follow basierend auf der Antwort von @ arielCo erstellt, das auch beendet, tail
wenn die Datei nicht mehr zum Schreiben geöffnet wird.
tail
Befehl mit der Option follow.tail
funktioniert das auch mit binären dateien?less +F
...wget ... && tar xjvf ...
Antworten:
Ich habe es unter Ubuntu mit dem LibreOffice-Quelltarball getestet, während ich es
wget
heruntergeladen habe:Es funktioniert auch unter Solaris 10, RHEL3, AIX 5 und Busybox 1.22.1 in meinem Android-Telefon (Verwendung
tail +1 -f file
mit Busybox).quelle
/proc/*/fd/
regelmäßig scannt und prüft, ob die Datei endgültig geschlossen ist.tail
gedacht, dass das mit Binray-Dateien funktioniert ...-f
Option ist Standard. Es wird jedoch nicht automatisch beendet, wenn der Download abgeschlossen ist.tail +1f
funktioniert das nicht. Sie müssen tuntail -n +1
Das Problem ist, dass
cat
nicht bekannt ist, dass die Datei noch angehängt wird. Sobald ercat
auf das (aktuelle) Ende der Datei stößt, wird sie beendet.Sie müssen in
wget
eine Pipe (oder einen FIFO) schreiben, um dies zu vermeiden.quelle
curl
die standardmäßig auf stdout ausgegeben wird. Und (1)-f -
ist redundant,tar
liest standardmäßig von stdin und (2) die meistentar
s können die Komprimierung automatisch erkennen, sodass diesj
häufig nicht erforderlich ist.curl http://... | tar x
tee
: Dascurl http://… | tee ….tbz | tar -xj
Fortsetzen des Downloads ist jedoch komplizierter als das erneute Aufrufen desselben Befehls.So lesen und verfolgen Sie eine Datei von Anfang an, bis sie unterbrochen wird:
Um dies zu demonstrieren, versuchen Sie dies (unter der Annahme von Bash mit GNU Coreutils):
(Hinweis: Das
+1f
von anderen erwähnte wird zumindest im GNU-tail
Befehl als Dateiname interpretiert .)Das Obige funktioniert für eine einzelne Datei. Die Verkettung mehrerer Dateien kann nicht allen deterministisch folgen, ohne sich an der ersten zu halten. Um ' cat and follow ' nur nach der letzten Datei zu erstellen, kann die Prozessersetzung verwendet werden . Hier ist eine weitere Demonstration:
quelle
tail +1f file
aber nicht.tail +1f
in Kombination mit anderen Optionen wie--pid