<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Der Informatikblog &#187; rekursiv</title>
	<atom:link href="http://www.informatik-blog.net/tag/rekursiv/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.informatik-blog.net</link>
	<description>Informatik &#38; Co.</description>
	<lastBuildDate>Mon, 28 Jun 2010 19:43:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Linux-Kommandozeilen-Tools Teil 1 – Mit wget Webseiten herunterladen</title>
		<link>http://www.informatik-blog.net/2009/02/05/linux-kommandozeilen-tools-teil-1-%e2%80%93-mit-wget-webseiten-herunterladen/</link>
		<comments>http://www.informatik-blog.net/2009/02/05/linux-kommandozeilen-tools-teil-1-%e2%80%93-mit-wget-webseiten-herunterladen/#comments</comments>
		<pubDate>Thu, 05 Feb 2009 01:42:54 +0000</pubDate>
		<dc:creator>PaoloPinkel</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Bilder]]></category>
		<category><![CDATA[herunterladen]]></category>
		<category><![CDATA[Kommandozeile]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[rekursiv]]></category>
		<category><![CDATA[wget]]></category>

		<guid isPermaLink="false">http://www.informatik-blog.net/?p=526</guid>
		<description><![CDATA[Wget ist das Programm mit dem ich zum ersten Mal die Macht der Kommandozeile kennengelernt habe. Für ein Projekt brauchte ich viele Bilder, um genau zu sein mehrere Tausend Bilder. Über die Sammlung der Public-Domain-Bilderquellen der Wikipedia bin ich auf die NASA-Bilder-Sammlung aufmerksam geworden, die Public Domain ist. Es ist nicht schwierig herauszufinden, dass sich [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Wget ist das Programm mit dem ich zum ersten Mal die Macht der Kommandozeile kennengelernt habe. Für ein Projekt brauchte ich viele Bilder, um genau zu sein mehrere Tausend Bilder.</p>
<p>Über die Sammlung der Public-Domain-Bilderquellen der <a href="http://de.wikipedia.org/wiki/Wikipedia:Public-Domain-Bilderquellen">Wikipedia</a> bin ich auf die <a href="http://grin.hq.nasa.gov/">NASA-Bilder-Sammlung</a> aufmerksam geworden, die Public Domain ist. Es ist nicht schwierig herauszufinden, dass sich alle Bilder im Ordner http://grin.hq.nasa.gov/IMAGES/ befinden.</p>
<p><span id="more-526"></span></p>
<p>Möchte man jetzt alle Bilder herunterladen, könnte man natürlich jedes Bild einzeln mit der rechten Maustaste anclicken und dann speichern. Das muss aber nicht sein, wenn man das Kommandozeilentool wget kennt.</p>
<p>Zunächst muß man ein Terminal öffnen (Anwendungen ? Zubehör ? Terminal in fast allen aktuellen Linux-Distributionen). Dann sollte man sich kurz über wget informieren (man wget hilft dabei). Generell sollte man sich immer erst über Kommandozeilentools schlau machen, bevor man sie nutzt! Sonst wundert man sich, dass nach einem sudo rm -Rvf / nichts mehr funktioniert <img src='http://www.informatik-blog.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
Jetzt kann es losgehen. Wget braucht als einziges Argument eine URL</p>
<p>Wenn wir nur eine einzige URL runterladen wollen, reicht:<br />
<code><br />
wget http://grin.hq.nasa.gov/IMAGES/LARGE/GPN-2000-000038.jpg</code></p>
<p>Und schon liegt die Datei im aktuellen Verzeichnis. Natürlich ist das langweilig, wir wollen ja nicht nur eine Datei herunterladen, sondern alle in dem entsprechenden Verzeichnis. Hier kommt die Option -r zu Hilfe, die ein rekursives Downloaden ermöglich. Das heißt, jede heruntergeladene html-Datei wird nach Dateiverweisen durchsucht, um diese Dateien dann auch herunterzuladen (rekursiv eben). Die Rekursionstiefe ist mit der Option -l beliebig einstellbar.</p>
<p>In unserem NASA-Beispiel reicht ein Rekursionstiefe von 1.</p>
<p><code>wget -r -l 1 http://grin.hq.nasa.gov/IMAGES/SMALL/ &amp;</code></p>
<p>Und schon beginnt wget sein Werk. Wget beendet sich von allein, wenn alle Dateien heruntergeladen sind. Das &amp; am Ende sorgt dafür, daß der Prozess im Hintergrund läuft.</p>
<p>Auf diese Weise kann man sich ganze Webpräsenzen herunterladen und mitnehmen. Damit sie wirklich offline nutzbar sind, muß man webseiteninterne Links auf die lokal heruntergeladenen Dateien umleiten. Auch das ist mit wget kinderleicht, da es die Option -convert-links gibt:</p>
<p><code>wget --convert-links -r http://www.informatik-blog.de</code></p>
<p>Wenn man die Ordnerstruktur der Webseite nicht beibehalten, sondern alle Dateien in ein Verzeichnis downloaden möchte, nutzt man die Option -nd (nd für no directories). Wenn man nur bestimmte Dateitypen haben möchte gibt es die Option -A (Acceptlist). Mit -random-wait kann man einen menschlichen Internetnutzer simulieren, der zwischen den Seitenaufrufen verschieden lange Zeiten verstreichen lässt. Sonst feuert wget aus allen Rohren und nutzt die gesamte zur Verfügung stehende Download-Rate.</p>
<p>Mit<br />
wget -r -l 10 -A .jpg -nd -random-wait <code>http://www.meineinternetadresse.de &amp;</code></p>
<p>ist es dann ganz einfach möglich von einer beliebigen Webseite alle jpg-Dateien herunterzuladen. Und das mit einer Zeile!<br />
Eine kleine Einschränkung gibt es. Wget hält sich (normalerweise) an die Regeln der robots.txt. Das heißt, wenn dort der Zugriff auf das Bilderverzeichnis für robots gesperrt ist, bleibt wget draußen.</p>
<p>Natürlich sollte man nur Dateien von Webseiten herunterladen, die das auch ausdrücklich erlauben! So stehen zum Beispiel amerikanische Regierungsseiten fast immer unter der Public Domain. Und auch das Projekt Gutenberg ist kostenlos.</p>
<p>Wget kann noch vielmehr und wäre sogar als Basis für eine eigene Suchmaschine geeignet. Davon später vielleicht mehr.</p>
<p>Viel Spaß mit wget!</p>
<h4>Weiterführende Links</h4>
<p><a href="http://www.gnu.org/software/wget/">http://www.gnu.org/software/wget/</a><br />
<a href="http://de.wikipedia.org/wiki/Wget">http://de.wikipedia.org/wiki/Wget</a></p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://www.informatik-blog.net/2009/02/05/linux-kommandozeilen-tools-teil-1-%e2%80%93-mit-wget-webseiten-herunterladen/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Rekursives löschen</title>
		<link>http://www.informatik-blog.net/2009/02/04/rekursives-loeschen/</link>
		<comments>http://www.informatik-blog.net/2009/02/04/rekursives-loeschen/#comments</comments>
		<pubDate>Wed, 04 Feb 2009 13:21:57 +0000</pubDate>
		<dc:creator>bleed_ch</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[löschen]]></category>
		<category><![CDATA[rekursiv]]></category>
		<category><![CDATA[verzeichnis]]></category>

		<guid isPermaLink="false">http://www.informatik-blog.net/?p=515</guid>
		<description><![CDATA[Viel zu oft wird die Frage &#8220;Wie lösche ich ein Verzeichnis rekursiv?&#8221; mit einem 100-Zeilen Skript beantwortet. Schade eigentlich, denn viele Programmierer haben sich immer noch keine Mühe gemacht die Änderungen von PHP5 wahrzunehmen. Dabei würde sich ein genauerer Blick lohnen, die Antwort auf diese Frage ist seither sehr kurz und einfach geworden: function recursive&#40;$dest&#41; [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Viel zu oft wird die Frage <strong>&#8220;Wie lösche ich ein Verzeichnis rekursiv?&#8221;</strong> mit einem 100-Zeilen Skript beantwortet. Schade eigentlich, denn viele Programmierer haben sich immer noch keine Mühe gemacht die Änderungen von PHP5 wahrzunehmen. <span id="more-515"></span> Dabei würde sich ein genauerer Blick lohnen, die Antwort auf diese Frage ist seither sehr kurz und einfach geworden:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> recursive<span style="color: #009900;">&#40;</span><span style="color: #000088;">$dest</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$list</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_diff</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">scandir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$dest</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'.'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'..'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$list</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$file</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$dest</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$value</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">is_dir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> recursive<span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span> <span style="color: #990000;">unlink</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #990000;">rmdir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$dest</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Wie wir sehen, passt das sehr einfach in 9 Zeilen. Was geschieht denn genau? Zuerst lesen wir das Verzeichnis, das wir beim Funktionsaufruf mitgegeben haben aus (scandir()) und entfernen danach <strong>&#8220;.&#8221; (aktuelles Verzeichnis)</strong> und <strong>&#8220;..&#8221; (übergeordnetes Verzeichnis)</strong>. Das muss sein, denn sonst würden wir bei ersterem in eine Endlosschleife geraten und bei letzterem über das Ziel hinaus schiessen und übergeordnete Dateien löschen. Sobald wir also unsere Liste haben, gehen wir sie durch und prüfen ob es sich um ein Verzeichnis handelt oder nicht. Ist es eins, so wird die gesamte Prozedur nochmal darauf angewandt &#8211; andernfalls wird die Datei einfach gelöscht und das geht dann so lange bis nichts mehr übrig ist.</p>
<p>Verwendet wird es übrigens folgendermassen:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>recursive<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'./bilder'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">print</span> <span style="color: #0000ff;">&quot;super, hat geklappt.&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">print</span> <span style="color: #0000ff;">&quot;ohje, bestimmt hab ich keine berechtigung dazu.&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Schlägt der Funktionsaufruf fehl, erscheinen (je nach tiefe der Verzeichnise) von PHP generierte Fehlermeldungen.</p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://www.informatik-blog.net/2009/02/04/rekursives-loeschen/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
