Wie man einen Hash für eine Zeichenfolge (url) in bash für wget Caching berechnen

StackOverflow https://stackoverflow.com/questions/1602378

  •  05-07-2019
  •  | 
  •  

Frage

Ich baue ein kleines Tool, das Dateien mit wget wird, die URLs aus verschiedenen Dateien zu lesen. Die gleiche URL kann in verschiedenen Dateien vorhanden sein; Die URL kann in einer Datei mehrmals auch vorhanden sein. Es wäre ineffizient sein, eine Seite mehrmals zum Download (jedes Mal der entsprechende URL in der Liste gefunden (en)).

Damit ist der einfache Ansatz ist die heruntergeladene Datei zu speichern und wget zu anweisen, nicht erneut herunterladen, wenn es schon da ist.

Das wäre sehr einfach; jedoch sind die Urls sehr lang (viele viele GET-Parameter) und daher nicht als solche für Dateinamen verwendet werden können (wget gibt die Fehlermeldung "Kann nicht schreiben ... [] Dateinamen zu lang).

Also, ich brauche die heruntergeladenen Dateien umbenennen. Aber für den Caching-Mechanismus funktioniert, muss das Umbenennungsschema implementieren „eine URL <=> einen namen“: wenn eine bestimmte URL mehrere Namen hat, wird das Caching nicht (dh, wenn ich einfach die Dateien in der Bestellnummer sie gefunden werden, werde ich nicht wget identifizieren lassen, welche URLs bereits heruntergeladen wurden).

Die einfachste Umbenennungsschema wäre ein MD5-Hash des Dateinamens berechnen (und nicht der Datei selbst, das ist das, was md5sum tut); das würde sicherstellen, dass die Dateinamen ist einzigartig und dass eine gegebene URL Ergebnisse in immer dem gleichen Namen.

Es ist möglich, dies in Perl, etc. zu tun, aber es kann direkt in bash oder mit einem System-Utility (RedHat) durchgeführt werden?

War es hilfreich?

Lösung

Klingt wie Sie die md5sum-System-Utility wollen.

URLMD5=`/bin/echo $URL | /usr/bin/md5sum | /bin/cut -f1 -d" "`

Wenn Sie wollen nur den Hash erstellen, die auf den Dateinamen, können Sie diese schnell mit sed bekommen:

FILENAME=`echo $URL | /bin/sed -e 's#.*/##'`
URLMD5=`/bin/echo $FILENAME | /usr/bin/md5sum | /bin/cut -f1 -d" "`

Beachten Sie, dass, je nach Distribution, der Weg kann cut /usr/bin/cut.

Andere Tipps

Ich habe nicht den rep auf der Antwort zu kommentieren, aber es gibt eine Klarstellung Epsilon Prime Antwort: standardmäßig Echo wird eine neue Zeile am Ende des Textes drucken. Wenn Sie die MD5-Summen wollen mit passen, was von einem anderen Werkzeug (zB PHP, Java md5, etc) erzeugt werden, müssen Sie rufen

echo -n "$url"

, die die Neuen-Zeile unterdrücken wird.

Andere Optionen auf meinem Ubuntu (Precise) Feld:

  • echo -n $STRING | sha512sum
  • echo -n $STRING | sha256sum
  • echo -n $STRING | sha224sum
  • echo -n $STRING | sha384sum
  • echo -n $STRING | sha1sum
  • echo -n $STRING | shasum

Andere Optionen auf meinem Mac:

  • echo -n $STRING | shasum -a 512
  • echo -n $STRING | shasum -a 256
  • etc.

Neuere Versionen von Bash bieten ein assoziatives Array, sowie ein indiziertes Array . So etwas wie dies könnte für Sie arbeiten:

declare -A myarray
myarray["url1"]="url1_content"
myarray["url2"]=""

if [ ! -z ${myarray["url1"]} ] ; then 
    echo "Cached";
fi

wget wird umbenennen typischerweise die Dateien mit einem filename.html.1, 0,2 usw., so könnte man das assoziative Array verwenden, um eine Liste zu speichern, von denen ein heruntergeladen wurde und etwas der tatsächliche Dateiname war.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top