Schon mit wenigen Zeilen Shell-Code programmieren Sie einen maßgeschneiderten Download-Manager, der Ihnen beim Herunterladen von Dateien aus dem Internet viel Arbeit abnimmt.
Es gehört schon fast zum Alltag, Daten aus dem Internet herunterzuladen. Dabei dient meist der Webbrowser als Schnittstelle. In der Regel bieten Webseiten Dateien zum Herunterladen an, die Sie dann einzeln im Browser anklicken. In der Standardeinstellung landen diese dann meist im Ordner Downloads/. Laden Sie viele Dateien herunter, gerät die manuelle Auswahl des Speicherorts schnell zur Geduldsprobe. Einfacher wäre es, ein Werkzeug würde diesen Job für Sie übernehmen.
Planung
Wie schon aus der Kurzbeschreibung hervorgeht, handelt es sich bei diesem Unterfangen um ein größeres Projekt, das durchaus einer guten Planung und eines sinnvollen Konzepts bedarf. Der Download-Manager soll nicht nur Dateien herunterladen, sondern auch davor warnen, wenn die Festplatte durch den Download vollzulaufen droht. Zudem tragen die meisten Dateien eine Endung, wie etwa .jpg, .iso oder .epub. Die nutzt unser Projekt dazu, die Dateien gleich in entsprechende Ordner mit passendem Namen zu sortieren.
Für dieses Unterfangen benötigen Sie zwei weitere Kommandozeilenprogramme, die moderne Linux-Distributionen standardmäßig nicht vorinstalliert mitbringen: Xclip und Lynx. Das Kommandozeilentool Xclip überwacht die Zwischenablage, Lynx dient als Webbrowser fürs Terminal. Es bietet aber auch für die Kommandozeile etliche Optionen, sodass es sich auch als Link-Spider verwenden lässt, der für das Anzeigen von Links viele Optionen bietet.
Grundlegend gilt es, beim Planen zu berücksichtigen, dass die URL der Download-Seite und deren Links erst einmal ins Terminal gelangen müssen. Dabei helfen Xclip und Lynx. Dieses Projekt enthält auch Funktionen, die bestimmte Teilaufgaben übernehmen, wie etwa das Erfassen und Auswählen der Links. Selbst wenn eingangs noch nicht genau feststeht, was diese Funktionen später enthalten, ist es ein guter Anfang, ein Skript anzulegen, das diese Funktionen erst einmal leer vereint (Listing 1).
Listing 1
Skriptgerüst ohne Funktionen
#!/bin/bash
function erfassung () { :; }
function splitter () { :; }
function umbenennen () { :; }
function download () { :; }
function menu () { :; }
Dieses Gerüst dient als Basis, von der ausgehend Sie sich stückweise um die Einzelteile kümmern. Am besten legen Sie den Fokus zunächst auf eine einzelne Funktion und nicht aufs große Ganze. Sie überlegen für jedes Teil einzeln, welche Aufgaben es erledigt, wie viele und welche Parameter es braucht, und ob es irgendwelche Rückgabewerte gibt.
Falls es Ihnen leichter fällt, lagern Sie Teile des Skripts aus und binden den Quellcode dann mit der Dot- oder Source-Notation ein, etwa via . ausgelagerteFunktion. Als gute Idee erwies sich auch der Ansatz, solche Funktionen möglichst abstrakt und unabhängig vom Skript zu gestalten, sodass sich zum Beispiel eine Funktion zum Umbenennen von Dateien auch in andere Skripte einfügen ließe, ohne sie zu modifizieren.
Abstrakt gesagt nimmt eine Funktion keinen, einen oder mehrere Parameter entgegen und liefert eventuell irgendetwas zurück, egal, ob Sie eine Funktion in diesem Skript einsetzen oder in einem völlig anderen Kontext.
Grundlegendes
In Listing 2 sehen Sie einige Dinge, die es grundlegend für das Skript zu erledigen gilt. Dazu zählen das Deklarieren grundlegender Variablen, die im späteren Verlauf den Programmablauf bestimmen und Dateitypen in einem Array speichern.
Zwar gibt es eine Vielzahl verschiedener Dateitypen, die man aus dem Web herunterlädt. Es bleibt Ihnen überlassen, ob Sie dem Array noch irgendwelche Dateitypen hinzufügen möchten und welche Struktur Sie dabei wählen. Es bietet sich jedoch an, eine gewisse Ordnung einzuhalten, etwa indem Sie Grafiken in einer Zeile und Video- oder andere Dateitypen in einer anderen Zeile erfassen. Die letzte Zeile erfasst noch den zur Verfügung stehenden Speicherplatz in einer Variablen.
Listing 2
Grundlegende Variablen
VERBOSE=true
LYNX="$(which lynx)"
XCLIP="$(which xclip)"
download_verzeichnis=~/Downloads7
dateitypen=(jpg jpeg png tiff gif bmp swf svg)
dateitypen+=(mp4 mp3 mpg mpeg vob m2p ts mov avi wmf asf mkv webm 3gp flv)
dateitypen+=(gzip zip tar gz tar.gz 7zip)
dateitypen+=(pdf doc xlsx odt ods epub txt mobi azw azw3)
dateitypen+=(iso dmg exe deb rpm)
dateitypen+=(java kt py sh zsh)
dateitypen+=($(echo ${dateitypen[@]} | sed -r 's/.+/\U&/'))
frei=$(df /home | gawk 'NR == 2{print $4}')
Listing 3 enthält zwei Funktionen, die Sie im weiteren Verlauf des Programms benötigen, um Meldungen auszugeben, falls die Variable VERBOSE auf true steht. Des Weiteren sehen Sie zwei If-Abfragen, die das Vorhandensein von Lynx und Xclip überprüfen. Fehlt eines von beiden, gibt das Skript eine Fehlermeldung aus und terminiert mit exit 1. Sollte das Download-Verzeichnis nicht existieren, legt das Skript es in der letzten Zeile an. Falls zu ausführliche Warnungen oder Fehlermeldungen Sie stören, setzen Sie VERBOSE auf false.
Listing 3
Fehlermeldungen ausgeben
function warn () {
if ${VERBOSE}; then
echo "WW: ${1}";
fi;
}
function err () {
if ${VERBOSE}; then
echo "EE: ${1}";
fi;
}
if [ -z ${LYNX} ]; then
err "Lynx nicht im System vorhanden."
err "Abbruch."
exit 1
fi
if [ -z ${XCLIP} ]; then
err "Xclip nicht im System vorhanden."
err "Abbruch."
exit 1
fi
[ ! -e ${download_verzeichnis} ] && mkdir -p ${download_verzeichnis}





