Werbung einblenden Werbung ausblenden


Home / Tutorials / Perl Handbuch / Arbeiten mit Verzeichnissen

die Dateien eines Ordners /mehrere Ordner in einem Verzeichnis anzeigen - glob
nach Dateien mit Regular Expressions in einer Verzeichnisstruktur suchen - glob und grep
nur die Verzeichnisse anzeigen - glob
die Verzeichnisse und die Dateien anzeigen - readdir
Verzeichnisse anlegen, umbenennen, löschen - mkdir, rename, rmdir
einzelne Dateien löschen - unlink

die Dateien eines Ordners /mehrere Ordner in einem Verzeichnis anzeigen - glob

Von großem Interesse ist es, welche Dateien und Unterverzeichnisse ein Verzeichnis enthält, siehe Suchmaschine. Darüber hinaus sollten Verzeichnisse eingerichtet, gelöscht oder umbenannt werden können. Meistens tritt dies bei Anwendungen auf, die der User komplett installiert, etwa einem Shop.

Welche Dateien sind in einem Ordner?
Hier wird die Funktion glob verwendet:

chdir("c:/sambar/docs/");
@banane=glob("*.*");
print @banane;

Mit chdir wird in ein bestimmtes Verzeichnis gewechselt. Hier werden alle Dateien "rausgfischt". Die Sterne sind wildcards.
Glob zeigt dann, welche Dateien sich im Ordner docs befinden.

Innerhalb der glob Funktion kann das Verzeichnis auch direckt angegeben werden, man muss dann nicht mit chdir in das entsprechende Verzeichnis wechslen. Das sieht dann so aus:

@banane=glob("c:/sambar/docs/*.*");
print @banane;

Als Ergebnis erhalten wir:
C:\testordner>perl testo.pl
c:/sambar/docs/favicon.icoc:/sambar/docs/feedback.htmc:/sambar/docs/index.htmc:/
sambar/docs/robots.txtc:/sambar/docs/search.dllc:/sambar/docs/thanks.stm
C:\testordner>


Auch folgende Schreibweise ist möglich:

@banane=glob("c:/sambar/*/*.htm");
print @banane;


Als Ergebnis erhalten wir:
C:\testordner>perl testo.pl c:/sambar/syshelp/features.htmc:/sambar/syshelp/fetcher.htmc:/sambar/sy
shelp/filter.htmc:/sambar/syshelp/Financec.htmc:/sambar/syshelp/ftp.htmc:/sambar
/syshelp/futures.htmc:/sambar/syshelp/history.htmc:/sambar/syshelp/howto.htmc:/s
ambar/syshelp/htaccess.htmc:/sambar/syshelp/index.htmc:/sambar/syshelp/install.h
tmc:/sambar/syshelp/iodbc.htmc:/sambar/syshelp/isapi.htmc:/sambar/syshelp/isapia
pp.htmc:/sambar/syshelp/isapiext.htmc:/sambar/syshelp/javaeng.htmc:/sambar/syshe
lp/lansetup.htmc:/sambar/syshelp/License.htmc:/sambar/syshelp/Log.htmc:/sambar/s
yshelp/logfmt.htmc:/sambar/syshelp/mail.htmc:/sambar/syshelp/mailhelp.htmc:/samb
ar/syshelp/mailit.htmc:/sambar/syshelp/mailpop3.htmc:/sambar/syshelp/mailsmtp.ht
mc:/sambar/syshelp/mime.htmc:/sambar/syshelp/modules.htmc:/sambar/syshelp/ntsec.
htmc:/sambar/syshelp/Observe.htmc:/sambar/syshelp/Param.htmc:/sambar/syshelp/par
amset.htmc:/sambar/syshelp/pro.htmc:/sambar/syshelp/Props_ld.htmc:/sambar/syshel
p/Proxy.htmc:/sambar/syshelp/proxyfaq.htmc:/sambar/syshelp/put.htmc:/sambar/sysh
elp/rewrite.htmc:/sambar/syshelp/roadmap.htmc:/sambar/syshelp/sched.htmc:/sambar
/syshelp/scl_init.htmc:/sambar/syshelp/script.htmc:/sambar/syshelp/search.htmc:/
sambar/syshelp/search2.htmc:/sambar/syshelp/sec.htmc:/sambar/syshelp/security.ht
mc:/sambar/syshelp/sendmail.htmc:/sambar/syshelp/server.htmc:/sambar/syshelp/ser
verx.htmc:/sambar/syshelp/Servlets.htmc:/sambar/syshelp/shutdown.htmc:/sambar/sy
shelp/side.htmc:/sambar/syshelp/Snd_file.htmc:/sambar/syshelp/snd_head.htmc:/sam
bar/syshelp/socks.htmc:/sambar/syshelp/ssi.htmc:/sambar/syshelp/ssl.htmc:/sambar
/syshelp/ssltech.htmc:/sambar/syshelp/statslog.htmc:/sambar/syshelp/Support.htmc
:/sambar/syshelp/telnet.htmc:/sambar/syshelp/vhosts.htmc:/sambar/syshelp/watcher
.htmc:/sambar/syshelp/webmail.htmc:/sambar/syshelp/win95.htmc:/sambar/syshelp/wi
ncgi.htm
C:\testordner>

Jetzt werden alle Dateien mit der Endung htm "rausgefischt", die unterhalb von sambar liegen. Also z.B. c:/sambar/docs/berlin/sehenswert.htm, c:/sambar/docs/dresden/museum.htm etc.
Leistungsfähige Regular Expression hat der glob Befehl nicht.

Möglich ist darüber hinaus noch:

@banane=glob("c:/sambar/*/?????.htm");
print @banane;

Jetzt werden alle Dateien in allen Ordnern direkt unter c:/sambar/ "rausgefischt", die sich aus 6 Zeichen einem Punkt und htm.zusammensetzen.

nach Dateien mit Regular Expressions in einer Verzeichnisstruktur suchen - glob und grep

Werden Regular Expression gebraucht, kann glob mit grep verbunden werden.
Das sieht dann in etwa so aus:

@banane=grep(/html|htm/, glob("c:/sambar/*/*.*"));
print @banane;

oder ausführlicher:

@kirsche=glob("c:/sambar/*/*.*");
@banane=grep(/html|htm/, @kirsche);
print @banane;

Es werden alle Dateien angezeigt, die in Verzeichnissen direkt unterhalb des Verzeichnisses Sambar liegen und auf html oder htm enden.

nur die Verzeichnisse anzeigen

Sollen nur die Verzeichnisse angezeigt werden, verfährt man wie im folgenden Beispiel:

@kirsche=glob("c:/sambar/*/");
 foreach $himbeere(@kirsche)
{
    print "$himbeere \n";
}

Als Ergebnis erhalten:

C:\testordner>perl testo.pl
c:/sambar/bin/
c:/sambar/cgi-bin/
c:/sambar/cgi-win/
c:/sambar/config/
c:/sambar/docs/
c:/sambar/include/
c:/sambar/lib/
c:/sambar/log/
c:/sambar/messages/
c:/sambar/perl/
c:/sambar/profiles/
c:/sambar/samples/
c:/sambar/search/
c:/sambar/servlets/
c:/sambar/sysadmin/
c:/sambar/syscss/
c:/sambar/syshelp/
c:/sambar/sysimage/
c:/sambar/tmp/

C:\testordner>

Das heisst, wir erhalten alle Ordner unterhalb von c:\sambar

die Verzeichnisse und die Dateien anzeigen

Eine Alternative hierzu ist der Befehl readdir( read directory).
Das sieht dann so aus:

opendir(BANANE,"c:/sambar/docs/");
@kirsche=readdir(BANANE);
closedir(BANANE);
print @kirsche;

Readdir hat gegenüber glob einen Vorteil. Man erhält sowohl die Dateien als auch die Verzeichnisse.
Die Syntax readdir geht auf den Verzeichnishandle, der erst mal mit opendir produziert werden muss. Der Verzeichnishandle sollte anschließend wieder geschlossen werden.
Nachdem man die Dateien hat, kann mit grep wieder eine Feinselektion vorgenommen werden:

opendir(BANANE,"c:/sambar/docs/");
@kirsche=grep(/html|htm/,readdir(BANANE));
closedir(BANANE);
print @kirsche;
Verzeichnisse anlegen, umbenennen, löschen - mkdir, rename, rmdir

Verzeichnisse sollten angelegt, gelöscht und umbenannt werden können. Wie das geht, zeigt folgendes Skript:

mkdir("c:/testofix/testle");
sleep(5);
rename("c:/testofix/testle","c:/testofix/teschtle");
sleep(5);
rmdir("c:/testofix/teschtle");

Das Skript sollte aus der Eingabeaufforderung heraus ausgelöst werden. Man geht dann in den Ordner testofix, den man schon eingerichtet hat. Nach 5 Sekunden wird das Verzeichnis testle eingerichtet mit mkdir, nach weiteren 5 Sekunden wird es umbenannt mit rename und nach weiteren 5 Sekunden entfernt mit rmdir.

Die Sache ist übrigens noch steigerungsfähiger:

for ($i=0;$i<3;$i++)
{
sleep(5);
mkdir("c:/testofix/testle");
sleep(5);
rename("c:/testofix/testle","c:/testofix/teschtle");
sleep(5);
rmdir("c:/testofix/teschtle");
}

Nachdem das Skript in der Eingabeaufforderung (bzw.Dos Box) ausgelöst worden ist, muss man sich schon ein bisschen, beeilen, damit man mit dem Windows Explorer in das Verzeichnis testofix kommt.
Die Funktion rename erwartet zwei Parameter, die Datei, die umbenannt werden soll, und den Namen der Datei. Werden unterschiedliche Pfade angegeben, wird sie umkopiert.

einzelne Dateien löschen - unlink

Es liegt nahe, dass Dateien auch gelöscht werden können.
Das passiert mit unlink:

open(KIRSCHE,">c:/testofix/zewa_wisch_und_wech.txt");
print KIRSCHE "Lieb ist vergänglich";
close(KIRSCHE);
sleep(5);
unlink("c:/testofix/zewa_wisch_und_wech.txt");

Zuerst wird eine Datei zewa_wisch_und_wech.txt eingerichtet. Dann macht das Skript ein Nickerchen für 5 Sekunden.
Anschließend wird die Datei zewa_wisch_und_wech.txt. gelöscht

vorhergehendes Kapitel