Wget – if / else Download-Bedingung?

Wget – if / else Download-Bedingung?

Ich möchte, dass wget einen bestimmten Dateityp einem anderen vorzieht, wenn die Dateien denselben Basisnamen haben.

Zum Beispiel:

Wennfoo.oggverfügbar, nicht herunterladenfoo.mp3


So verwende ich wget bisher zum Crawlen/automatischen Herunterladen (falls es jemanden interessiert):

wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.ogg,.mp3 http://www.foo.com/folder/

aber das ist natürlichbringt mir .mp3 UND .oggDateien. Irgendwelche Ideen?

  • (Syntax-Erklärung:
    -D: nur von dieser Domain herunterladen
    -I: nur von diesem Unterordner der Domain herunterladen
    -r: rekursiv (Links und Verzeichnisstruktur folgen)
    -l 1: nur 1 Link tief folgen
    -nc: kein Clobber = nur herunterladen, wenn Datei nicht existiert
    -A: nur alle *.ogg und *.mp3 akzeptieren/herunterladen (notwendige html-Dateien verwerfen)
    (-i (optional vor der URL): liest URLs aus der URL, lädt aber auch andere Dateitypen wie .png herunter, die man ursprünglich nicht haben wollte bzw. verwirft sie anschließend)

Antwort1

Einzelne Dateien

Um "Wenn DateiXexistiert, laden Sie es herunter; andernfalls laden Sie die Datei herunterj" können Sie Folgendes tun:

wget x || wget y

WennXexistiert, wird es heruntergeladen und wgetkehrt zurücktrue , wodurch der zweite Teil übersprungen wird. WennXist nicht vorhanden,wget gibt einen Fehlercode zurück (wahrscheinlich 8) und der zweite Teil des Ausdrucks wird ausgewertet (der herunterlädtj).

Rekursiv

Das wird Ihnen bei Ihrem rekursiven Download allerdings nicht viel helfen. Es würde mich überraschen, wenn wgetes die Möglichkeiten gäbe, Maskierung mit diesem Grad an Komplexität zu ermöglichen. Die Manpage scheint auch keine Form von ausgefallenen Bedingungen abzudecken. Ein leicht modifizierter Ansatz könnte jedoch funktionieren.

(Es scheint schwierig zu sein, ihn davon zu überzeugen wget, eine Liste der Dinge zu erstellen, die er herunterladen möchte. Meine erste Idee war, diese zu erstellen und sie vor dem Herunterladen entsprechend zu filtern, so wie @utkuerd vorschlägt.)

Ein erster Schritt wäre natürlich, zunächst alle OGG-Dateien herunterzuladen, vermutlich durch

wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.ogg -i http://www.foo.com/folder/

Die restlichen MP3-Dateien können dann mit der gleichen Methode heruntergeladen werden, vorausgesetzt, Sie verfügen über eine geeignete Maske, die Sie als --rejectListe bereitstellen können. Diese Liste sollte den Namen aller MP3-Dateien enthalten, die Sie nicht herunterladen möchten.

Unter der Annahme, dass ich schlage vor, Sie erstellen diese Liste wie folgt

bl=($(find ./ -name '*.ogg' -exec basename -s .ogg {} \+ | sed 's/\(^.\+$\)/\1.mp3/' ) )

Sie haben jetzt ein Bash-Array der zu blockierenden MP3-Dateien.

Um nur die entsperrten MP3-Dateien herunterzuladen, können Sie

IFS=','; wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.mp3 -R"${bl[*]}" -i http://www.foo.com/folder/; unset IFS

Die IFSVariable muss geändert werden, sodass die Liste nicht durch Leerzeichen getrennt ist.

Dies kann offensichtlich in unterschiedlichem Ausmaß schiefgehen, wenn die Liste der OGG-Dateien länger ist getconf ARG_MAX(dadurch wird der Wget-Befehl unterbrochen) oder die Dateinamen Leerzeichen enthalten (dadurch wird die Sperrliste unterbrochen, wodurch Sie möglicherweise eine zusätzliche Datei und (unwahrscheinlich) eine fehlende Datei erhalten). Beides kann behoben werden.

Beachten Sie, dass überflüssige Kommas in der AblehnungslisteinteressantErgebnisse.

Zusammenfassung des hervorragenden Vorschlags von @Bob

(siehe Kommentar unten)

Nach dem Abrufen der OGG-Dateien mit

wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.ogg -i http://www.foo.com/folder/

Sie könnten Dummy-MP3-Dateien wie folgt erstellen

find ./ -name '*.ogg' | sed 's/ogg$/mp3/' | xargs -d '\n' touch 

und holen Sie sich die restlichen MP3-Dateien mit (Ausnutzen -nc)

wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.mp3 -i http://www.foo.com/folder/

Die überflüssigen MP3-Dateien können dann mit etwas wie

find ./ -name '*.mp3' -size 0 -exec rm '{}' \+

Ich habe getestet, dass dies mit Leerzeichen in den Namen funktioniert.

Antwort2

Ich glaube nicht, dass die Option -A von wget die Möglichkeit bietet, auf intelligente Weise zwischen vorgegebenen Dateinamenmustern zu wählen. Höchstwahrscheinlich benötigen Sie ein Skript, um das gewünschte Ergebnis zu erzielen. Sie sollten die Verzeichnisliste abrufen, sie selbst analysieren und dann die gewünschten Dateien herunterladen.

Für das Herunterladen und Verwerfen von PNG-Dateien haben Sie das Flag -i falsch verwendet. Das Flag -i gibt eine Datei (oder URL) an, die herunterzuladende URLs enthält. Sie sollten den Startpunkt ohne Flag angeben. Wenn Sie das Flag -i entfernen, werden keine anderen Dateitypen heruntergeladen, sondern nur OGG-, MP3- und erforderliche HTML-Dateien. HTML-Dateien werden anschließend verworfen.

verwandte Informationen