wget erhält keine vollständige Verzeichnisliste

wget erhält keine vollständige Verzeichnisliste

Ich habe überall gesucht und konnte keine Antwort auf mein Problem finden. Ich bin nicht sicher, ob dies das richtige Forum ist, aber ich hoffe, dass mir hier jemand helfen kann.

Ich habe wget (FTP) verwendet, um meine Website mit der Spiegeloption auf meiner lokalen Festplatte zu sichern, und das ohne Probleme, bis vor kurzem. Vor kurzem hat ein Verzeichnis, das Bilder enthält, das vom Hosting-Dienst festgelegte Limit für die Anzahl der Elemente erreicht, die in einer FTP-Liste enthalten sein können. Ich habe keinen SSL-Zugriff auf das Konto.

Ich kann auf dem Remote-Server ein Skript ausführen, eine vollständige Verzeichnisliste (ls) in einer Datei abrufen und diese auf meinen lokalen Computer herunterladen.

Ist es möglich, diese Datei an wget weiterzuleiten und diese Dateien auf mein lokales Laufwerk spiegeln zu lassen, wie es vor Erreichen des Listenlimits der Fall war? Ich möchte, dass wget die generierte Liste liest und nach geänderten und hinzugefügten Dateien sucht. Hier sind die Fragen, auf die ich keine Antworten finden konnte:

1) Welcher ls-Befehl wäre der richtige, um die benötigten Informationen zu generieren? Derzeit erhalte ich nur die tatsächlichen Dateinamen, aber ich bin sicher, dass mehr erforderlich ist.

2) Funktioniert wget mit der Spiegeloption auch mit einer Eingabedatei oder lädt es einfach alle Dateien in der Eingabedatei herunter, ohne auf geänderten Status zu prüfen? Ich habe absolut keine Informationen zu dieser Kombination gefunden – nur zu der einen oder der anderen. Ich möchte nicht testen und am Ende eine vollständige Sicherung des Verzeichnisses erhalten – es wäre eine Verschwendung von Bandbreite und Zeit, alle diese Daten herunterzuladen.

Antwort1

Sie können dies tun, das einzige Problem ist, eine Ausgabe vonlsdas ist auf dem Remote-Computer und auf Ihrem lokalen Computer gleich. Mein ls hat eine Option --time-style=+%sdas zeigt die letzte Änderungszeit der Datei in Sekunden seit der Epoche an, was auf beiden Maschinen übereinstimmen sollte. Ich gehe davon aus, dass Sie dies nur für ein Verzeichnis tun möchten, andernfalls findwäre es angemessener, wenn Sie diesen Befehl hätten.

Führen Sie auf der Fernbedienung den Befehl „ls“ im gewünschten Verzeichnis in eine Datei aus:

cd ... # cd to the directory to list
ls -l --time-style=+%s . >/tmp/listfile

Kopieren Sie auf dem lokalen Rechner die Remote-Datei /tmp/listfilenach local /tmp/listfileund verwenden Sie dann awkum die ersten 4 Spalten der Ausgabe zu unterdrücken und die Liste nach Dateigröße, Datum und Dateiname zu sortieren. (Ich gehe davon aus, dass Sie möglicherweise Dateinamen mit Leerzeichen haben, daher das bizarre AWK).

awk '{$1="";$2="";$3="";$4="";print}' </tmp/listfile | sort >/tmp/a

Im gespiegelten Verzeichnis erhalten Sie die gleiche Auflistung:

cd ... # cd to same directory we listed remotely
ls -l --time-style=+%s . | awk '{$1="";$2="";$3="";$4="";print}' | sort >/tmp/b

Vergleichen Sie die beiden sortierten Listen und löschen Sie die Zeilen, die gleich sind mit Komm. Löschen Sie die Spalten size und date (und übrigens auch den Tabulator am Zeilenanfang in /tmp/b, nicht in /tmp/a, und 2 Leerzeichen zwischen den Spalten) und löschen Sie doppelte Dateinamen miteinzigartig. (Sie müssen nicht erneut sortieren, da die doppelten Zeilen nebeneinander liegen.)

comm -3 /tmp/a /tmp/b | awk '{$1="";$2="";print substr($0,3)}' | uniq >/tmp/c

Die Liste in /tmp/c enthält alle Dateien, die neu sind, eine andere Größe oder einen anderen Zeitstempel haben oder entfernt wurden. Übergeben Sie jede einzelne Datei an wget zum Abrufen (immer noch im entsprechenden Verzeichnis).

while read file
do  rm -f "$file"
    wget -N --no-directories ..../"$file" # non recursive single file to .
done </tmp/c

Sie sollten Ihren Wget-Mirror so konfigurieren, dass dieses Verzeichnis nicht mehr abgerufen wird.

Wenn Sie dazu in der Lage sind find ... -printf '%9s %T+ %p\n', können Sie mit dieser Technik beginnen und oben im Spiegelverzeichnis die Spiegelung effektiv selbst durchführen.

verwandte Informationen