Wie kann ich überprüfen, ob eine URL mit der Shell vorhanden ist und sich wahrscheinlich kräuselt?

76

Ich suche nach einer einfachen Shell-Prüfung (+ Curl), die als wahr oder falsch bewertet wird, ob eine URL vorhanden ist (gibt 200 zurück) oder nicht.

Sorin
quelle

Antworten:

125

Mit --failwird der Exit-Status bei einer fehlgeschlagenen Anforderung ungleich Null. Durch --headdie Verwendung wird das Herunterladen des Dateiinhalts vermieden, da wir ihn für diese Überprüfung nicht benötigen. Durch --silentdie Verwendung wird vermieden, dass Status oder Fehler von der Prüfung selbst ausgegeben werden.

if curl --output /dev/null --silent --head --fail "$url"; then
  echo "URL exists: $url"
else
  echo "URL does not exist: $url"
fi

Wenn Ihr Server HEAD-Anforderungen ablehnt, können Sie alternativ nur das erste Byte der Datei anfordern:

if curl --output /dev/null --silent --fail -r 0-0 "$url"; then
Charles Duffy
quelle
4
Include -o /dev/null, um das Drucken des Headers auf stdout zu unterdrücken
Shawn Chin
3
Fügen Sie - Ort hinzu, um Weiterleitungen zu folgen und das Vorhandensein der Weiterleitungs-URL anstelle der ursprünglichen URL zu melden
Ivan Kozik
1
Diese Lösung scheint für den vorübergehenden Umzug von Fall 302 nicht zu funktionieren, selbst wenn -L oder --location verwendet werden. Beispiel: github.com/stedolan/jq/releases/download/jq-1.5/jq-1.5.tar.gz
Nam Nguyen
2
@NamNguyen, ... es ist ein interessantes Problem, dies ordnungsgemäß zu handhaben - ein Ansatz besteht darin -r 0-0, nur das erste Byte der Datei anzufordern. Ich habe die Antwort entsprechend geändert.
Charles Duffy
2
@NamNguyen Ich würde auch stark empfehlen return 0und return 1für Wahrhaftigkeit und Falschheit, anstatt stdout zu verwenden, um zurückzukehren trueund falseals Zeichenfolgen. Auf diese Weise kann jemand ausführen: if existURL "$url"ohne zusätzlichen (ineffizienten) Aufwand für den Versuch, sein Standard zu erfassen und zu interpretieren.
Charles Duffy
32

Ich finde wget ein besseres Werkzeug dafür als CURL; Es gibt weniger Optionen, an die Sie sich erinnern müssen, und Sie können in bash tatsächlich nach dem Wahrheitswert suchen, um festzustellen, ob dies standardmäßig erfolgreich war oder nicht.

if wget --spider http://google.com 2>/dev/null; then
  echo "File exists"
else
  echo "File does not exist"
fi

Mit dieser --spiderOption sucht wget nur nach der Datei, anstatt sie herunterzuladen, und 2> /dev/nulldie stderr-Ausgabe von wget wird stummgeschaltet.

ailnlv
quelle
Das "kann tatsächlich seinen Wahrheitswert in Bash überprüfen" ist nicht eindeutig zu wget; mit --failkann man das gleiche mit locken machen.
Charles Duffy
3
Deshalb habe ich "standardmäßig" gesagt. Versuchen Sie zu laufen wget google.com/asdfund curl google.com/asdf. curlGibt standardmäßig EXIT_SUCCESS zurück, wenn ein 404-Fehler wgetauftritt , während EXIT_FAILURE zurückgegeben wird.
ailnlv
Das ist sehr langsam. Ich überprüfe eine Site, die Dateien zum Herunterladen in der Summe von 1 GB hat, aber ich möchte sie nicht herunterladen, überprüfe einfach, ob die Ziele existieren
rubo77
1
Dafür ist das --spiderArgument da: Es wird wgetzurückgegeben, nachdem die Existenz der Datei überprüft wurde, anstatt sie herunterzuladen.
ailnlv
Ich habe ein Problem damit auf github: wget --spider github.com/linuxwacom/libwacom/releases/download/libwacom-1.6/… Führt zu 403 FORBIDDEN und der Meldung "Remote-Datei existiert nicht - defekter Link !!! ". Ich brauchte dies für ein Skript, um zu überprüfen, ob eine Remote-URL vorhanden ist, um Programme automatisch zu aktualisieren. (Interessanterweise lädt wget ohne das Flag --spider die Datei ohne Probleme herunter. Das ist seltsam ...)
shevy