![]() ![]() ![]() |
|
![]() |
Funktionen f�r Datei- und Verzeichnis-Management |
![]() |
|
![]() |
Perl kommt, wie bereits mehrfach betont wurde, aus der Unix-Welt. Daher sind die Funktionen rund um Datei- und Verzeichnismanagement auch an den typischen M�glichkeiten von Unix orientiert. Einige dieser Funktionen sind nur anwendbar, wenn Ihr Perl-Script auf einem Unix-System ausgef�hrt wird. Funktionen zur Dateiverwaltung, die auch auf anderen Betriebssystemen ausf�hrbar sind, k�nnen als "plattformunabh�ngig" bezeichnet werden, auch wenn das nicht absolut korrekt ist. Bei den hier aufgef�hrten Beschreibungen zu den einzelnen Funktionen zum Datei- und Verzeichnismanagement wird darauf hingewiesen, wenn es Beschr�nkungen auf bestimmte Betriebssystemtypen gibt.
Weitere Funktionen zur Dateiverwaltung, etwa zum Kopieren und Verschieben von Dateien, gibt es ebenfalls, doch geh�ren sie nicht zum Kernel von Perl. Solche Funktionen sind �ber das Standardmodul
File
erreichbar.
Die hier beschriebenen Funktionen erwarten als Parameter Pfadangaben. Als Trennzeichen zwischen Verzeichnisnamen bei Pfadangaben benutzen Sie aus Portabilit�tsgr�nden am besten grunds�tzlich den einfachen Schr�gstrich, auch bei Perl-Scripts, die unter Windows laufen sollen. Perl unter Windows setzt dies intern in die Microsoft-eigenen Backslashes um.
Beispiele:
Syntaxbeispiel | Bedeutung |
---|---|
".." |
relative Angabe, ein Verzeichnis h�her |
"../../bin" |
relative Angabe, zwei Verzeichnisse h�her und von dort aus gerechnet Unterverzeichnis "bin" |
"images" |
relative Angabe, Unterverzeichnis "images" im aktuellen Verzeichnis |
"/" |
absolute Angabe, Wurzelverzeichnis |
"/usr/bin/perl" |
absolute Angabe ab Wurzelverzeichnis |
"c:/windows/system" |
absolute Angabe mit Laufwerksangabe - Windows-typisch |
Relative Pfadangaben sollten Sie nur verwenden, wenn das aktuelle Arbeitsverzeichnis bekannt ist.
Um das aktuelle Arbeitsverzeichnis in Perl zu ermitteln, k�nnen Sie notieren:
use Cwd; my $Arbeitsverzeichnis = cwd;
In dem Skalar $Arbeitsverzeichnis
steht dann anschlie�end der vollst�ndige Pfad zum aktuellen Arbeitsverzeichnis. Benutzt wird dazu das Standardmodul
cwd
.
Viele der hier beschriebenen Funktionen erwarten als Parameter eine Rechteangabe.
Bei Unix-Systemen haben alle Eintr�ge eines Dateisystems Rechte. Jede Datei, jedes Verzeichnis geh�rt einem Benutzer, und jeder Benutzer geh�rt zu einer Benutzergruppe. Der so genannte Superuser, also der Benutzer mit der so genannten root-Kennung, kann Benutzer und Benutzergruppen einrichten und manipulieren sowie Logindaten f�r die einzelnen Benutzer des Systems vergeben.
Ein Benutzer, der sich an einem Unix-System einloggt, erh�lt vom Betriebssystem eine individuelle Benutzerkennung, die User-ID (UID). Ebenso erh�lt jede Benutzergruppe eine Gruppen-ID (GID). Beide IDs sind Nummern. In einigen der hier beschriebenen Funktionen spielen diese IDs eine Rolle. Solche Funktionen sind dann in der Regel nur anwendbar, wenn das Perl-Script in einer Unix-Umgebung laufen soll.
Das System wei� stets, welcher eingeloggte Benutzer eine Datei oder ein Verzeichnis erzeugt. Die Datei bzw. das Verzeichnis geh�rt dann diesem Benutzer und seiner prim�ren Benutzergruppe. Grunds�tzlich werden auf Unix-Systemen f�r jede Datei und jedes Verzeichnis die Zugriffsrechte f�r den besitzenden Benutzer, seine prim�re Benutzergruppe und f�r Fremdbenutzer ("Rest der Welt") festgelegt. Dabei wird zwischen Leserecht, Schreibrecht und Ausf�hrungsrecht unterschieden. Jedes dieser drei Rechte (Lesen, Schreiben, Ausf�hren) kann f�r jede der drei Benutzertypen (Besitzer, zugeh�rige Gruppe und Rest der Welt) auf "ja" oder "nein" gesetzt werden. Die Darstellung dieser Rechte erfolgt �blicherweise in zwei Arten: entweder als eine Zeichenkette von 3 mal 3, also 9 Zeichen, oder als Oktalzahl mit 3 Ziffern.
Darstellung als Zeichenkette (Beispiele):
rwxrwxrwx rw-r--r-- rwx------
Der Buchstabe r
steht f�r Lesen (read), w
f�r Schreiben (write), und x
f�r Ausf�hren (execute). Ist ein solcher Buchstabe gesetzt, so ist damit das entsprechende Recht vergeben. Ist das entsprechende Recht nicht gesetzt, wird stattdessen ein Bindestrich -
notiert. Die ersten drei der neun Zeichen bedeuten die Lese-, Schreib- und Ausf�hrungsrechte des besitzenden Benutzers der Datei, die zweiten drei Zeichen die Lese-, Schreib- und Ausf�hrungsrechte seiner Gruppe, und die dritten drei Zeichen die Lese-, Schreib- und Ausf�hrungsrechte f�r den "Rest der Welt".
Der Wert rwxrwxrwx
bedeutet also: alle drei Benutzertypen (besitzender Benutzer, zugeh�rige Gruppe und Rest der Welt) haben an der Datei alle drei Rechte.
Der Wert rw-r--r--
bedeutet: der besitzende Benutzer hat die Rechte "Lesen" und "Schreiben", aber nicht "Ausf�hren", seine Gruppe und der Rest der Welt haben nur das Recht "Lesen", aber nicht die Rechte "Schreiben" und "Ausf�hren".
Der Wert rwx------
bedeutet: der besitzende Benutzer hat alle Rechte, seine Gruppe und der Rest der Welt haben �berhaupt keine Rechte.
Darstellung als Oktalzahl (gleiche Beispiele wie zuvor):
0777 0644 0700
Bei dieser Darstellung, die von den meisten der hier beschriebenen Funktionen gefordert wird, wird eine Zahl mit einer f�hrenden 0 notiert, was Perl die Zahl als Oktalzahl interpretieren l�sst. Die Zahl selber besteht aus den 3 nachfolgenden Ziffern. Bei Oktalzahlen sind nur Ziffern zwischen 0 und 7 erlaubt. Die erste Ziffer steht f�r die Rechte des besitzenden Benutzers, die zweite Ziffer f�r die seiner Benutzergruppe, und die dritte f�r die vom "Rest der Welt". Die Ziffern haben folgende Bedeutung f�r die Rechtezuweisung:
Der Wert 0777
bedeutet also: alle drei Benutzertypen (besitzender Benutzer, zugeh�rige Gruppe und Rest der Welt) haben an der Datei alle drei Rechte.
Der Wert 0644
bedeutet also: der besitzende Benutzer hat die Rechte "Lesen" und "Schreiben", seine Gruppe und der Rest der Welt haben nur das Recht "Lesen".
Der Wert 0700
bedeutet also: der besitzende Benutzer hat alle Rechte, seine Gruppe und der Rest der Welt haben �berhaupt keine Rechte.
Als Hilfe f�r Dateirechte k�nnen Sie auch den Unix-Dateirechte-Setzer (chmod) benutzen.
Die einfachste und schnellste Methode, gezielt auf bestimmte Eigenschaften einer Datei oder eines Verzeichnisses zuzugreifen, ist diejenige, die Perl mit den Dateitestoperatoren zur Verf�gung stellt. Einige der Dateitestoperatoren geben eine Zahl zur�ck, beispielsweise die Gr��e einer Datei in Bytes, andere nur, ob eine Aussage zutrifft oder nicht. Eine �bersicht der Dateitestoperatoren finden Sie in der
Tabelle der Dateitestoperatoren.
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); my $Textdatei = "/usr/bin/myprog/readme.txt"; my $UnbekannteDatei = "/usr/bin/myprog/doit"; my $Perl-Datei = "/usr/webcgi-local/betrag.pl"; my $Log-Datei = "/usr/web/logs/heute.log"; print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><body>\n"; print "Die Textdatei hat eine Gr��e von ",-s $Textdatei," Bytes<br>\n"; printf "Die Textdatei wurde vor %.3f Tagen zuletzt bearbeitet<br>\n",-M $Textdatei; print "Die unbekannte Datei ist ",-d $UnbekannteDatei ? "ein Verzeichnis<br>\n" : "kein Verzeichnis<br>\n"; print "Die Perl-Datei ",-e $Perl-Datei ? "existiert<br>\n" : "existiert nicht<br>\n"; print "Es hat Zugriffe gegeben" if not -z $Log-Datei; print "</body></html>\n";
Alle Dateitestoperatoren zum Abfragen von Eigenschaften bestehen aus einem Minuszeichen, gefolgt von einem Buchstaben ohne Leerzeichen dazwischen. Dahinter folgt, durch ein Leerzeichen getrennt, die Angabe der gew�nschten Datei, wenn erforderlich mit vollst�ndigem Pfadnamen.
Im obigen Beispiel 1 werden drei Skalare definiert, die Dateinamen mit Pfadangaben speichern. Anschlie�end wird HTML-Code ausgegeben. Dabei werden verschiedene Aussagen �ber Eigenschaften der drei Dateien getroffen.
Die erste print
-Anweisung enth�lt als Parameter einen Dateitestoperator (siehe dazu auch die Syntax von print). In der Anweisung wird durch Anwendung von
-s $Textdatei
die Gr��e der Datei ermittelt und an der entsprechenden Stelle ausgegeben.
Im zweiten Befehl, einem Aufruf von printf, wird mit
-M $Textdatei
ermittelt, seit wie viel Tagen die Datei nicht mehr ge�ndert wurde. Auch dieser Wert wird ausgegeben. Da -M
eine Gleitkommazahl zur�ckgibt, wird die Ausgabe mit Hilfe der printf
-Funktion auf drei Nachkommastellen gek�rzt.
In den nachfolgenden beiden print
-Befehlen sehen Sie eine typische Konstruktion, wie Dateitestoperatoren, die nur "wahr" oder "falsch" zur�ckgeben, angewendet werden. Zum Einsatz kommt in beiden F�llen eine einfache Entweder-Oder-Abfrage. Im ersten Fall wird mit dem Dateitestoperator
-d
abgefragt, ob die unbekannte Datei ohne Endung ein Verzeichnis ist oder eine normale Datei. Im zweiten Fall wird mit -e
abgefragt, ob die Perl-Datei existiert oder nicht.
Das letzte Beispiel zeigt, wie ein Dateitestoperator in eine nachgestellte bedingte Anweisung eingebaut wird - ebenfalls eine typische Konstruktion. Das Beispiel ermittelt mit Hilfe des Dateitestoperators
-z
, ob die Datei leer ist oder nicht. Wenn sie nicht leer ist, wird eine Meldung ausgegeben, dass es Zugriffe gegeben hat.
Dateitestoperatoren k�nnen auch vergebene Datei-Handles anstelle von direkten Dateiangaben verarbeiten. Wenn Sie beispielsweise mit open(FILE,"<datei.htm")
eine Datei zum Lesen �ffnen, k�nnen Sie mit -s FILE
die Gr��e der Datei ermitteln.
Syntax | Bemerkung | Bedeutung | Beispiel | Erl�uterung |
---|---|---|---|---|
-A |
ermittelt, wie lange seit Programmstart auf eine Datei zugegriffen wurde. R�ckgabewert ist die Zeit in Tagen als Gleitpunktzahl. | printf("%.3f Tage |
F�r die vom Script verarbeitete Datei $Datei wird ausgegeben, wie lange darauf zugegriffen wurde. |
|
-B |
ermittelt, ob es sich um eine Bin�rdatei handelt. | binmode(FILE) if -B FILE; |
Wenn die Datei des File-Handles FILE eine Bin�rdatei ist, wird binmode aufgerufen. |
|
-b |
Unix- spezifisch |
ermittelt, ob eine Ger�tedatei blockorientiert ist. | exit(-1) unless -b "/cdrom"; |
Wenn "/cdrom" kein blockorientiertes Ger�t ist, wird das Script beendet. |
-C |
ermittelt die Inode-Ver�nderungszeit einer Datei seit Programmstart. R�ckgabewert ist die Zeit in Tagen als Gleitpunktzahl. |
if(-C $Datei > 10) { |
Wenn die Inode-Zeit der Datei $Datei gr��er als 10 Tage ist, wird "Warnung!" ausgegeben. |
|
-c |
Unix- spezifisch |
ermittelt, ob eine Ger�tedatei zeichenorientiert ist. | exit(-1) if -c "/cdrom"; |
Wenn "/cdrom" zeichenorientiert ist, wird das Script beendet. |
-d |
ermittelt, ob es sich um ein Verzeichnis handelt. | chdir("texte") if -d "texte"; |
Wenn "texte" ein Verzeichnis ist, wird in das Verzeichnis gewechselt. | |
-e |
ermittelt, ob ein Verzeichniseintrag existiert. | print "text.txt existiert!" |
Wenn die Datei "text.txt" existiert, wird dies ausgegeben. | |
-f |
ermittelt, ob es sich um eine normale Datei (keine Ger�tedatei, kein Verzeichnis usw.) handelt. | Verarbeiten() if -f "text.txt"; |
Wenn die Datei "text.txt" eine normale Datei ist, wird eine Subroutine aufgerufen. | |
-g |
Unix- spezifisch |
ermittelt, ob bei einer Datei das setgid-Bit (set-group-ID-Bit) gesetzt ist. |
chmod 02771, "daten" |
Wenn das Verzeichnis "daten" kein setgid-Bit besitzt, werden die entsprechenden Rechte gesetzt. |
-k |
Unix- spezifisch |
ermittelt, ob bei einer Datei das Sticky-Bit gesetzt ist (Bit z.B. f�r die Anweisung, Code eines Programms nach dessen Ausf�hrung im Speicher zu behalten, weil es voraussichtlich �fter ausgef�hrt wird). | print "test.pl ist sticky" |
Wenn die Datei "text.pl" das Sticky-Bit gesetzt hat, wird dies ausgegeben. |
-l |
Unix- spezifisch |
ermittelt, ob es sich um einen symbolischen Link handelt. | print readlink("text.txt") |
Wenn die Datei "text.txt" ein symbolischer Link ist, wird dessen Wert ausgegeben. |
-M |
ermittelt, wie lange eine Datei seit Programmstart nicht ge�ndert wurde. R�ckgabewert ist die Zeit in Tagen als Gleitpunktzahl. | printf("seit %.3f Tagen |
F�r die Datei $Datei wird ausgegeben, wie lange sie nicht mehr ver�ndert wurde. |
|
-o /-O |
Unix- spezifisch |
ermittelt, ob die Datei der effektiven UID (-o ) bzw. der realen UID (-O ) geh�rt. |
Verarbeiten() |
Wenn die Datei "text.txt" der effektiven UID geh�rt, wird eine Subroutine aufgerufen. |
-r /-R |
Unix- spezifisch |
ermittelt, ob die effektive UID/GID (-r ) bzw. die reale UID/GID (-R ) Leserecht f�r die Datei besitzt. |
open(FILE,"<text.txt") |
Wenn die effektive UID/GID Leserecht auf die Datei "text.txt" hat, wird sie zum Lesen ge�ffnet. |
-p |
Unix- spezifisch |
ermittelt, ob es sich um eine named pipe (FIFO) handelt. | print "pipe" if -p "myprog"; |
Wenn die Datei "myprog" eine named pipe ist, wird dies ausgegeben. |
-S |
Unix- spezifisch |
ermittelt, ob die Datei eine Socket-Datei ist (wird von Client-Server-Prozessen, die auf einem Rechner laufen, als Schnittstelle benutzt). | next if -S $_; |
Wenn die aktuelle Datei innerhalb einer angenommenen Schleife zur �berpr�fung von allen Verzeichniseintr�gen ein Socket ist, startet der n�chste Schleifendurchgang. |
-s |
ermittelt die Dateigr��e in Bytes. | print -s $DirEintrag |
Wenn der Verzeichniseintrag $DirEintrag kein Verzeichnis ist, wird die Dateigr��e ausgegeben. |
|
-T |
ermittelt, ob es sich um eine Textdatei handelt. | Verarbeiten() if -T "text.txt"; |
Wenn die Datei "text.txt" eine Textdatei ist, wird eine Subroutine aufgerufen. | |
-t |
Unix- spezifisch |
ermittelt, ob der Verzeichniseintrag ein tty, d.h. ein angeschlossenes Ger�t (Terminal) ist (unter Unix werden Peripherieger�te als Dateien behandelt). | print "STDIN ist tty" |
Wenn der Standardeingabekanal tty ist, wird dies ausgegeben. |
-u |
Unix- spezifisch |
ermittelt, ob bei einer Datei das setuid-Bit (Set-User-ID-Bit) gesetzt ist. | die "kein uid-Bit" |
Wenn bei der Datei "text.pl" kein setuid-Bit gesetzt ist, wird das Script mit einer Fehlermeldung beendet. |
-w /-W |
Unix- spezifisch |
ermittelt, ob die effektive UID/GID (-w ) bzw. die reale UID/GID (-W ) Schreibrecht f�r die Datei besitzt. |
open(FILE,">text.txt") |
Wenn die reale UID/GID f�r die Datei "text.txt" Schreibrechte besitzt, wird sie zum Schreiben ge�ffnet. |
-x /-X |
Unix- spezifisch |
ermittelt, ob die effektive UID/GID (-x ) bzw. die reale UID/GID (-X ) Ausf�hrrecht f�r die Datei besitzt. |
system("myprog") |
Wenn die effektive UID/GID f�r die Datei "myprog" Rechte zum Ausf�hren der Datei besitzt, wird sie �ber einen system -Aufruf ausgef�hrt. |
-z |
ermittelt, ob eine Datei leer ist, also 0 Bytes hat. | open(FILE,"<text.txt") |
Wenn die Datei "text.txt" nicht leer ist, wird sie zum Lesen ge�ffnet. |
Macht ein Verzeichnis zum aktuellen Arbeitsverzeichnis. So ist es m�glich, nach dem Wechseln in ein Verzeichnis dort abgelegte Dateien zu �ffnen, ohne sich um Pfadnamen k�mmern zu m�ssen.
Erwartet als Parameter:
1. den Pfadnamen des Verzeichnisses, zu dem gewechselt werden soll. Es kann sich um eine relative oder eine absolute Pfadangabe handeln.
Es ist auch m�glich, keinen Parameter zu �bergeben. In diesem Fall wechselt die Funktion in das Verzeichnis, das in der Umgebungsvariablen HOME gespeichert ist.
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); chdir("/usr/txt/rfc"); open(DATEI,"<rfc1867.txt"); my @Zeilen = <DATEI>; close(DATEI); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Test-Ausgabe</title></head><body><pre>\n"; print "@Zeilen"; print "</pre></body></html>\n";
Das Beispielscript wechselt mit chdir
in das Verzeichnis /usr/local/txt/rfc
, also in ein bestimmtes Unterverzeichnis ab Wurzelverzeichnis gerechnet. Dort wird dann eine Datei ge�ffnet, eingelesen und wieder geschlossen (Erl�uterungen zu diesen Befehlen siehe open). Anschlie�end wird HTML-Code erzeugt. Dabei werden die Zeilen der eingelesenen Datei ausgegeben.
Setzt die Rechte zum Lesen, Schreiben und Ausf�hren einer oder mehrerer Dateien f�r Benutzer, Benutzergruppe und Rest der Welt (Unix-spezifisch).
Erwartet als Parameter:
1. eine Rechteangabe. Der Wert muss numerisch oktal �bergeben werden, nicht als Zeichenkette!
2. bis n. eine oder mehrere Dateien/Verzeichnisse, f�r die diese Rechte gesetzt werden sollen, wenn n�tig mit Pfadnamen.
Gibt die Anzahl der vorgenommenen �nderungen zur�ck.
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); my $Verzeichnis = "/usr/web/docs/cgi-bin"; chdir($Verzeichnis); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Test-Ausgabe</title></head><body>\n"; my @Dateien = glob("*.pl"); my $Datei; foreach $Datei (@Dateien) { chmod(0755,$Datei); print "$Datei auf 0755 gesetzt<br>\n"; } print "</body></html>\n";
Das Beispiel setzt alle Perl-Dateien eines CGI-Verzeichnisses auf die Rechte 0755
- auf vielen Servern eine sinnvolle Einstellung f�r CGI-Scripts. Zu diesem Zweck werden alle Dateien des Verzeichnisses $Verzeichnis
(dem CGI-Verzeichnis) mit glob ausgew�hlt. Die Liste
@Dateien
, in der die ausgew�hlten Dateien anschlie�end stehen, wird daraufhin in einer foreach-Schleife abgearbeitet. Mit
chmod(0755,$Datei)
wird die jeweils aktuelle Perl-Datei mit den gew�nschten Rechten versehen. Zur Kontrolle gibt das Beispielscript aus, welche Dateien ge�ndert wurden.
Jede Datei unter Unix hat einen Eigent�mer, der durch zwei Zahlen identifiziert wird: die pers�nliche User-ID (UID) und die zugeh�rige Gruppen-ID (GID). Die Funktion �ndert Besitzer und Besitzergruppe von einer oder mehreren Dateien. Auf den meisten Unix-Systemen ist dazu eine Root-Kennung erforderlich.
Erwartet als Parameter:
1. die numerische UID (User-ID des Besitzers),
2. die numerische GID (Gruppen-ID der Besitzergruppe),
3. bis n. eine oder mehrere Dateien, f�r die die angegebenen UID und GID gelten sollen, wenn n�tig mit Pfadnamen.
Gibt die Anzahl der vorgenommenen �nderungen zur�ck.
#!/usr/bin/perl -w use strict; chdir("/usr/data/web/htdocs"); opendir(DIR, "/usr/data/web/htdocs") || die "$!\n"; my @Eintraege = readdir(DIR); closedir(DIR); foreach (@Eintraege) { chown(1034, 518, $_) if -f $_; }
Das Beispiel �ndert f�r alle regul�ren Dateien des angenommenen Verzeichnisses /usr/data/web/htdocs
die Besitzerschaft auf den Benutzer mit der User-ID 1034 und der Gruppen-ID 518.
Bestimmt ein neues Verzeichnis als "virtuelles" Wurzelverzeichnis. Absolute Pfadangaben, die mit /
beginnen, beziehen sich anschlie�end darauf. Auf den meisten Unix-Systemen ist zum Anwenden dieser Funktion eine Root-Kennung erforderlich.
Erwartet als Parameter:
1. den Pfadnamen des Verzeichnisses, das zum Wurzelverzeichnis werden soll. Es kann sich um eine relative oder eine absolute Pfadangabe handeln.
Es ist auch m�glich, keinen Parameter zu �bergeben. In diesem Fall wird der Inhalt der vordefinierten Variablen
$_
als Pfadnamen des gew�nschten Verzeichnisses interpretiert.
#!/usr/bin/perl -w use strict; chroot("/usr/local/web/domains/eidideldum"); chdir("/"); opendir(DIR, "."); my @Eintraege = readdir(DIR); closedir(DIR); foreach(@Eintraege) { print "$_\n"; }
Das Beispiel setzt den Pfad /usr/local/web/domains/eidideldum
als neues Wurzelverzeichnis. Anschlie�end wechselt das Script mit chdir in das neue Wurzelverzeichnis
("/")
. Zur Kontrolle liest das Script das aktuelle Verzeichnis (".")
ein und listet die eingelesenen Verzeichniseintr�ge anschlie�end auf (Erl�uterungen zu diesen Befehlen siehe opendir).
W�hlt aus einem Verzeichnis alle Dateien aus, die einem bestimmten Dateinamenmuster entsprechen. Das ist wesentlich einfacher als das Operieren mit den Funktionen opendir,
readdir und
closedir. Der Nachteil von
glob
ist allerdings, dass diese Funktion eine Unix-Shell startet, um an ihr Ergebnis zu kommen. Die Funktion ist daher nur auf Unix-Systemen verf�gbar, und ausf�hrbar ist sie auch nur, wenn das Script ausreichende Rechte zum Starten der Shell besitzt. Es gibt jedoch bei den Standardmodulen f�r Dateiverwaltung ein Modul, das den
glob
-Algorithmus komplett in Perl ausf�hrt.
Erwartet als Parameter:
1. Das Dateinamenmuster, wenn n�tig mit Pfadangabe.
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); my @HTML_Dateien = glob("/usr/web/docroot/*.htm"); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Test-Ausgabe</title></head><body>\n"; foreach (@HTML_Dateien) { print "$_<br>\n"; } print "</body></html>\n";
Das Beispielscript w�hlt im Verzeichnis /usr/web/docroot
alle Dateien aus, die auf htm
enden. Zur Kontrolle gibt das Script HTML-Code mit allen eingelesenen Dateien aus.
Die folgende Tabelle enth�lt Beispiele f�r Dateimuster:
Dateimuster | Bedeutung |
---|---|
* |
w�hlt alle Dateien und Verzeichnisse aus, auch solche, die keine Endung haben. |
*.* |
w�hlt alle Dateien und Verzeichnisse aus, die aus Namen und Endung bestehen. |
*.gif |
w�hlt alle GIF-Dateien aus |
index.* |
w�hlt alle Dateien aus, die index als Namen haben, unabh�ngig von der Endung. |
???.* |
w�hlt alle Dateien aus, deren Name aus drei Zeichen besteht, unabh�ngig von der Endung. |
????.txt |
w�hlt alle TXT-Dateien aus, deren Name aus vier Zeichen besteht. |
Die link-Funktion, die dem Unix-Befehl ln
entspricht, legt aus Sicht des Benutzers eine Kopie einer Datei an. Es handelt sich jedoch intern nach wie vor nur um eine einzige Datei, die lediglich nunmehr unter zwei verschiedenen Namen (und gegebenenfalls an zwei Stellen im Verzeichnisbaum) zu finden ist. Wird die Datei an einer dieser Stellen, an denen sie repr�sentiert wird, ge�ndert, gilt die �nderung auch f�r die anderen Stellen, an denen die Datei repr�sentiert wird. Wird eine der Dateien gel�scht (z.B. mit unlink), so bleiben andere Repr�sentationen der Datei davon unber�hrt. Erst wenn die letzte Repr�sentation der Datei gel�scht ist, ist die Datei endg�ltig gel�scht.
Erwartet als Parameter:
1. die bereits existierende Datei, von der eine neue Repr�sentation erzeugt werden soll, wenn n�tig mit Pfadangabe,
2. die neu zu erzeugende Repr�sentation der Datei, wenn n�tig mit Pfadangabe.
Gibt 1
zur�ck, wenn die Operation erfolgreich war, und 0
, wenn sie nicht erfolgreich war (z.B. weil im Zielverzeichnis kein Schreibrecht besteht).
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); my $Erfolg = link("single.txt","../double.txt"); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Test-Ausgabe</title></head><body>\n"; $Erfolg ? print "Erfolg" : print "kein Erfolg"; print "</body></html>\n";
Das Beispiel wendet die Funktion link
an, um von der Datei single.txt
im aktuellen Verzeichnis eine neue Repr�sentation zu erzeugen, die im Verzeichnis oberhalb (../
) unter dem Namen double.txt
erscheint. Der R�ckgabewert wird in dem Skalar $Erfolg
gespeichert. Zur Kontrolle erzeugt das Beispiel HTML-Code und gibt dabei mit Hilfe einer einfachen Entweder-Oder-Abfrage den Erfolgsstatus der Operation an.
Diese Funktion leistet das gleiche wie die Funktion stat. N�here Beschreibung und Beispiel siehe dort.
Im Unterschied zu stat
ermittelt lstat
nicht die Eigenschaften einer Datei, sondern die einer Dateiverkn�pfung, eines so genannten symbolischen Links. Wenn es sich nicht um eine Repr�sentation einer Datei handelt (also wenn die Datei nur einmal im Verzeichnisbaum erscheint), wird beim Aufruf von lstat
intern automatisch ein normaler Aufruf von stat
gestartet. lstat
erfasst also im Gegensatz zu stat
auch Dateirepr�sentationen und wird deshalb in der Praxis eher eingesetzt als stat
.
Legt ein neues Verzeichnis an und erm�glicht es, f�r das neue Verzeichnis die Rechte f�r Lesen, Schreiben und Ausf�hren zu vergeben (nur bei Unix-Systemen wirksam).
Erwartet als Parameter:
1. den Namen des neuen Verzeichnisses, wenn n�tig Pfadnamen.
2. eine Rechteangabe. Der Wert muss numerisch oktal �bergeben werden, nicht als Zeichenkette! Zum Ermitteln der gew�nschten Oktalzahl k�nnen Sie den
Unix-Dateirechte-Setzer bei den kleinen Helferlein verwenden.
Auf Systemen, die keine Unix-Rechteverwaltung kennen, also z.B. unter Windows, ist der zweite Parameter bedeutungslos.
Gibt 1
bzw. TRUE
zur�ck, wenn die Operation erfolgreich war, und 0
bzw. FALSE
, wenn das Anlegen des Verzeichnisses nicht m�glich war (z.B. weil in dem Verzeichnis, in dem das Unterverzeichnis angelegt werden sollte, kein Schreibrecht besteht). Der genaue Fehlertext kann in diesem Fall �ber die vordefinierte Variable
$!
ermittelt werden.
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); my @Verzeichnisbaum = ( "texte", "texte/briefe", "texte/rechnungen", "texte/rechnungen/alt", "texte/rechnungen/neu", "grafiken", "grafiken/fotos", "grafiken/fotos/fremde", "grafiken/cliparts", ); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Test-Ausgabe</title></head><body>\n"; chdir("/temp"); foreach(@Verzeichnisbaum) { mkdir($_,0777); print "Unterverzeichnis <strong>$_</strong> angelegt<br>\n"; } print "</body></html>\n";
Das Beispiel definiert eine Liste namens @Verzeichnisbaum
. Darin werden Eintr�ge gespeichert, die eine anzulegende Unterverzeichnisstruktur darstellen. Weiter unten im Beispielscript wird diese Liste in einer foreach-Schleife abgearbeitet. Dabei wird jedes einzelne der Verzeichnisse mit
mkdir
angelegt. Das jeweils aktuelle Verzeichnis der Liste steht innerhalb der Schleife in $_
. Als zweiter Parameter wird die Oktalzahl 0777
�bergeben. Damit erhalten alle Benutzer der Verzeichnisse alle Rechte. Das Beispielscript erzeugt HTML-Code und gibt f�r jedes angelegte Verzeichnis einen entsprechenden Satz aus.
Liest den Wert einer symbolischen Link-Datei aus. Das sind Link-Dateien, die z.B. mit Hilfe von symlink erzeugt wurden.
Erwartet als Parameter:
1. den Namen der symbolischen Link-Datei, wenn n�tig mit Pfadnamen.
Es ist auch m�glich, keinen Parameter zu �bergeben. In diesem Fall wird der Inhalt der vordefinierten Variablen
$_
verwendet.
Gibt den vollst�ndigen Pfad der Datei aus, auf die sich die Link-Datei bezieht. Im Fehlerfall gibt die Funktion undef
zur�ck und schreibt den Fehlertext in die vordefinierte Variable $!
. Auf Betriebssystemen, die keine symbolischen Links kennen, also z.B. unter Windows, produziert der Aufruf dieser Funktion einen schweren Fehler.
#!/usr/bin/perl use strict; use CGI::Carp qw(fatalsToBrowser); chdir("/tmp"); symlink("/usr/local/webdocs/index.htm","webindex.sym"); my $Inhalt = readlink("webindex.sym"); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Test-Ausgabe</title></head><body>\n"; print "Inhalt der symbolischen Datei: $Inhalt\n"; print "</body></html>\n";
Das Beispielscript wechselt zun�chst mit chdir ins Verzeichnis
/tmp
. Dort legt es mit symlink
eine symbolische Link-Datei namens webindex.sym
an, die ein symbolischer Link zu der Datei /usr/local/webdocs/index.htm
ist. Mit readlink
wird anschlie�end der Wert ausgelesen, der der symbolischen Datei zugeordnet ist. Zur Kontrolle erzeugt das Beispielscript HTML-Code. Dabei wird der webindex.sym
zugeordnete Pfadnamen zur verlinkten Datei ausgegeben.
Erwartet als Parameter:
1. den Namen der umzubenennenden Datei oder des umzubenennenden Verzeichnisses, wenn n�tig mit Pfadnamen.
2. den neuen Namen der Datei oder des Verzeichnisses, wenn n�tig mit neuem Pfadnamen.
Wenn der erste Parameter eine Datei ist und der zweite Parameter der Name eines anderen Verzeichnisses, wird die Datei in das andere Verzeichnis verschoben. Es ist jedoch mit dieser Funktion nicht m�glich, als ersten und zweiten Parameter zwei unterschiedliche Verzeichnisse anzugeben, um das erste Verzeichnis in das zweite zu verschieben.
Es ist au�erdem nicht m�glich, Dateien auf eine andere Partition zu verschieben. Abhilfe schafft hierbei die Funktion move
aus dem Standardmodul
File::Copy
.
Gibt true
zur�ck, wenn die Operation erfolgreich war, ansonsten false
.
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); chdir("/htmldocs"); opendir(DIR,"."); my @Eintraege = readdir(DIR); closedir(DIR); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Test-Ausgabe</title></head><body>\n"; my $Eintrag; my $Name; my $NeuerEintrag; foreach $Eintrag (@Eintraege) { if($Eintrag =~ /(.+)\.htm/) { $Name = $1; $NeuerEintrag = $Name.".html"; rename($Eintrag,$NeuerEintrag); print "$Eintrag in $NeuerEintrag umbenannt<br>\n"; } } print "</body></html>\n";
Das Beispiel bewirkt, dass alle Dateien eines Verzeichnisses, die auf die Endung .htm
enden, in gleichnamige Dateien mit der Endung .html
umbenannt werden.
Das Script wechselt zun�chst mit chdir in das Verzeichnis
/htmldocs
. Anschlie�end liest es dieses aktuelle Verzeichnis ("."
) in die Liste @Eintraege
ein (Erl�uterungen zu diesen Befehlen siehe opendir). Das Beispielscript erstellt HTML-Code. Dabei werden die Eintr�ge des eingelesenen Verzeichnisses in einer
foreach-Schleife abgearbeitet. Bei jedem Eintrag wird gepr�ft, ob es sich um eine Datei mit der Endung
.htm
handelt. Wenn ja, wird der "Vorname" der Datei in $Name
gespeichert und ein neuer Dateiname aus dem Wert von $Name
und der Endung .html
definiert. Anschlie�end wird die Funktion rename
aufgerufen. Dabei wird der bisherige Eintrag, also eine Datei .htm
, in den neuen Eintrag, also eine Datei mit gleichem Vornamen, nur mit der Endung .html
, umbenannt. Zur Kontrolle listet das Script alle Umbenennungen auf.
Erwartet als Parameter:
1. den Namen des zu l�schenden Verzeichnisses, wenn n�tig den Pfadnamen.
Das Verzeichnis muss leer sein, andernfalls kann es mit dieser Funktion nicht gel�scht werden. Nicht leere Verzeichnisse lassen sich mit der Funktion rmtree
aus dem Standardmodul
File::Path
l�schen.
Gibt 1
zur�ck, wenn das Verzeichnis gel�scht wurde. Falls ein Fehler aufgetreten ist, wird 0
zur�ckgegeben, und in der vordefinierten Variablen
$!
steht die Fehlermeldung.
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); my $Verzeichnis = $ENV{'QUERY_STRING'}; my $Ergebnis = rmdir($Verzeichnis); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Test-Ausgabe</title></head><body>\n"; if($Ergebnis == 1) { print "$Verzeichnis gelöscht!"; } else { print "$!"; } print "</body></html>\n";
Das Script erwartet einen �bergabeparameter, der beim Aufruf �ber einen URI hinter einem Fragezeichen notiert wird. Der �bergabeparameter besteht in der Pfadangabe des zu l�schenden Verzeichnisses. Beispiel:
/mydocs/texte/schrott
.
Das Script versucht, das �bergebene Verzeichnis zu l�schen. Der R�ckgabewert des Versuchs wird in dem Skalar $Ergebnis
gespeichert.
Anschlie�end erzeugt das Script HTML-Code. Dabei wird ausgegeben, ob das �bergebene Verzeichnis erfolgreich gel�scht wurde oder nicht. Wenn nicht, wird die erzeugte Fehlermeldung ausgegeben.
Ermittelt diverse Eigenschaften einer Datei auf einmal in Listenform. Die meisten dieser Eigenschaften sind Unix-spezifisch. Einige Eigenschaften lassen sich zwar auch auf anderen Plattformen abfragen, doch dazu ist es eigentlich einfacher, die Dateitestoperatoren f�r Dateien/Verzeichnisse zu verwenden. Die Funktion
stat
l�sst sich im Gegensatz zu lstat nicht auf Dateirepr�sentanzen (symbolische links), sondern nur auf "Originale" von Dateien anwenden.
Erwartet als Parameter:
1. den Namen der gew�nschten Datei, wenn n�tig mit Pfadnamen. Alternativ kann auch der Name eines Datei-Handles �bergeben werden.
Gibt eine Liste mit mehreren Elementen zur�ck. Jedes Element enth�lt eine bestimmte ermittelte Datei-Eigenschaft.
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); my $Datei = "/usr/webperldoc/index.html"; my @Info = stat($Datei); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Test-Ausgabe</title></head><body><pre>\n"; print "<strong>Datei:</strong> $Datei\n"; print "<strong>Geraetenummer:</strong> $Info[0]\n"; print "<strong>Inode-Nummer:</strong> $Info[1]\n"; printf "<strong>Zugriffsrechte:</strong> %o\n", $Info[2]; print "<strong>Anzahl Links auf Datei:</strong> $Info[3]\n"; print "<strong>User-ID des Besitzers:</strong> $Info[4]\n"; print "<strong>Gruppen-ID des Besitzers:</strong> $Info[5]\n"; print "<strong>Raw-Geraetenummer:</strong> $Info[6]\n"; print "<strong>Dateigroesse:</strong> $Info[7]\n"; print "<strong>Letzte Zugriffszeit:</strong> $Info[8]\n"; print "<strong>Letzte Aenderungsszeit:</strong> $Info[9]\n"; print "<strong>Inode-Aenderungsszeit:</strong> $Info[10]\n"; print "<strong>Ideale Blockgroesse:</strong> $Info[11]\n"; print "<strong>Anzahl belegter Blocks:</strong> $Info[12]\n"; print "</pre></body></html>\n";
Das Beispiel ermittelt f�r eine bestimmte Datei (/usr/data/artikel.zip) mit stat
die verf�gbaren Datei-Eigenschaften. Der R�ckgabewert der Funktion wird in einer Liste @Info
gespeichert. Das Beispiel erzeugt HTML-Code und listet darin alle 13 Einzeleigenschaften, abrufbar �ber $Info[0]
bis $Info[12]
, auf. Die folgende Tabelle enth�lt n�here Informationen �ber die einzelnen Eigenschaften.
Indexnr.: | Erl�uterung: |
---|---|
[0] |
Ger�tenummer: die systemweit eindeutige Ger�tenummer des Dateisystems, auf dem sich die Datei befindet. |
[1] |
Inode-Nummer: Die dateisystemweit eindeutige Nummer der Datei innerhalb des Dateisystems mit der Ger�tenummer aus [0]. |
[2] |
Dateityp/Zugriffsrechte: Der zur�ckgegebene Wert muss als Oktalzahl interpretiert werden (daher im obigen Beispiel auch die Ausgabe mit ![]() ![]() sys/stat.h definiert. |
[3] |
Anzahl Links auf Datei: Anzahl physikalisch existierender Repr�sentationen der Datei, also mindestens 1. Bei gesetzten Links, wie es in Perl z.B. mit der Funktion ![]() |
[4] |
User-ID des Besitzers: Die Nummer des Datei-Eigent�mers. |
[5] |
Gruppen-ID des Besitzers: Die Nummer der Gruppe, zu der der Datei-Eigent�mer geh�rt. |
[6] |
Raw-Ger�tenummer: Nur bei Ger�tedateien interessant. |
[7] |
Dateigr��e: Die logische Gr��e der Datei in Bytes. |
[8] |
Letzte Zugriffszeit: Zeitstempel des letzten lesenden oder schreibenden Zugriffs auf die Datei. Die zur�ckgegebene Zahl bedeutet die Anzahl Sekunden seit dem 1.1.1970 bis zum Augenblick des letzten Zugriffs. |
[9] |
Letzte �nderungszeit: Zeitstempel des letzten schreibenden Zugriffs auf die Datei. Die zur�ckgegebene Zahl bedeutet die Anzahl Sekunden seit dem 1.1.1970 bis zum Augenblick des letzten Zugriffs. |
[10] |
Inode-�nderungszeit: Zeitstempel des letzten Zugriffs auf die Datei, der eine �nderung der Inode-Nummer bewirkte. Die zur�ckgegebene Zahl bedeutet die Anzahl Sekunden seit dem 1.1.1970 bis zum Augenblick der letzten Inode-�nderung. |
[11] |
Ideale Blockgr��e: Die optimale Anzahl Bytes zum blockweisen Lesen oder Schreiben der Datei - in Perl mit Funktionen wie ![]() ![]() |
[12] |
Anzahl belegter Bl�cke: Die Anzahl der vom Betriebssystem benutzen Speicherbl�cke, um die Datei zu speichern. |
Erzeugt einen symbolischen Link auf eine anderswo gespeicherte Datei. Der erzeugte Verzeichniseintrag erscheint jedoch im Gegensatz zu einem Eintrag, der mit link erzeugt wurde, nicht als tats�chliche Repr�sentation der anderen Datei, sondern nur als Verkn�pfung zu der anderen Datei (Unix-spezifisch).
Erwartet als Parameter:
1. die existierende Datei, zu der ein symbolischer Link erzeugt werden soll, wenn n�tig mit Pfadangabe,
2. die neu zu erzeugende, symbolische Link-Datei, wenn n�tig mit Pfadangabe.
Gibt 1
zur�ck, wenn die Operation erfolgreich war, und 0
, wenn sie nicht erfolgreich war. Auf Betriebssystemen, die keine symbolischen Links kennen, kann diese Funktion zu einem schweren Fehler beim Ausf�hren des Scripts f�hren!
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); my $symlink_exists = eval { symlink("",""); 1 }; if($symlink_exists) { symlink("/usr/local/people/stefan.htm","/usr/local/links/stefan.link"); } print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Test-Ausgabe</title></head><body>\n"; opendir(DIR, "/u/web/teamon/temp"); my @Dateien = readdir(DIR); closedir(DIR); foreach (@Dateien) { print "$_<br>\n"; } print "</body></html>\n";
Das Beispiel �berpr�ft zun�chst mit Hilfe der Funktion eval, ob auf dem Betriebssystem, unter dem das Script ausgef�hrt wird, symbolische Links m�glich sind. Benutzen Sie zu einer solchen �berpr�fung den Befehl wie im Beispiel notiert. In dem R�ckgabewert, der im Beispiel in dem Skalar
$symlink_exists
gespeichert wird, steht der Wert 1 (true), falls symbolische Links m�glich sind. Mit der Konstruktion if($symlink_exists)
ist dann die bedingte Ausf�hrung von symlink
m�glich. Im Beispiel wird eine Link-Datei namens stefan.link
erzeugt, die auf die Originaldatei stefan.htm
in einem anderen Verzeichnis zeigt. Das Beispiel liest zur Kontrolle das Verzeichnis, in dem die symbolische Link-Datei erzeugt wurde, ein (Erl�uterungen zu diesen Befehlen siehe opendir) und gibt entsprechenden HTML-Code aus.
Diese Funktion ist nur f�r Unix-Systeme relevant. Wenn unter Unix eine neue Datei geschrieben wird, werden die dabei vergebenen Zugriffsrechte durch die Umask des aktuell laufenden Prozesses (z.B. das laufende Perl-Script, das die Datei erzeugt) beeinflusst. Durch Aufruf der Funktion umask
k�nnen Sie die Umask des laufenden Prozesses �ndern und dadurch deren Wirkung auf die Zugriffsrechte neu erzeugter Dateien beeinflussen.
Erwartet als Parameter:
1. eine Bitmaske f�r eine Rechteangabe. Der Wert muss oktal �bergeben werden. Jedes gesetzte Bit in der Bitmaske bewirkt, dass das entsprechende Bit in einer vom laufenden Prozess erzeugten Datei ausgeschaltet wird.
Gibt den alten Umask-Wert zur�ck.
#!/usr/bin/perl -w use strict; use Fcntl; sysopen(DATEI,"/usr/web/temp/test.txt", O_CREAT,0666); umask(0077); sysopen(DATEI2,"/usr/web/temp/test2.txt", O_CREAT,0666); open(LS,"ls -la /usr/web/temp |"); print while(<LS>); close(DATEI); close(DATEI2); close(LS);
Das Beispiel erzeugt mit zwei Aufrufen von sysopen zwei Dateien namens
test.txt
und test2.txt
. Bei beiden Dateien wird als gew�nschte Rechteangabe 0666
angegeben. Zwischen den beiden Aufrufen von sysopen
steht jedoch ein Aufruf von umask
. Der Funktion wird dabei 077
als Oktalzahl mit f�hrender 0
�bergeben. Dies bewirkt, dass bei der Datei test2.txt
die tats�chlichen Zugriffsrechte auf 0600
gesetzt werden. Zur Kontrolle gibt das Script das Ergebnis des Unix-Kommandos ls
f�r das Verzeichnis, in dem die beiden Dateien erzeugt wurden, aus.
Die Wirkungsweise von umask
l�sst sich besser verstehen, wenn man das Bitmuster der Oktalzahl aufschl�sselt und mit der Zeichenkettenschreibweise von Zugriffsrechten vergleicht.
Das Bitmuster der Oktalzahl 077
lautet: 000111111
(eine 7 ist 111 bin�r!).
Die Zeichenkettenschreibweise von 0666
lautet: rw-rw-rw-
.
Es stehen sich also 9 Bits und 9 Zeichen gegen�ber. Jedes gesetzte Bit (1
) der Oktalzahl setzt das analoge Zeichen an der gleichen Stelle auf -
, sofern dort vorher r
, w
oder x
stand.
Das Bitmuster 000111111
bewirkt also bei einem Recht rw-rw-rw-
, dass alle hinteren 6 Zeichen auf -
gesetzt werden, sodass rw-------
herauskommt (was wiederum oktal 0600
entspricht).
L�scht eine oder mehrere Dateien gleichzeitig. Verzeichnisse k�nnen mit diesem Befehl nicht gel�scht werden, dazu steht die Funktion rmdir zur Verf�gung.
Erwartet als Parameter:
1. eine Liste von Dateien, die gel�scht werden sollen.
Gibt die Anzahl der erfolgreich gel�schten Dateien zur�ck.
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); chdir("/tmp"); opendir(DIR,"."); my @Eintraege = readdir(DIR); closedir(DIR); my $Anzahl = 0; foreach (@Eintraege) { unless( -d $_) { $Anzahl+= unlink($_); } } print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Test-Ausgabe</title></head><body>\n"; print "$Anzahl Dateien entfernt!\n"; print "</body></html>\n";
Mit chdir wechselt das Beispielscript zun�chst in das Verzeichnis, in dem etwas gel�scht werden soll. Anschlie�end wird das Verzeichnis mit
opendir,
readdir und
closedir eingelesen. Die Verzeichniseintr�ge stehen anschlie�end in der Liste
@Eintraege
. In einer foreach-Schleife wird die Liste sodann abgearbeitet. Mit
unless( -d $_)
wird abgefragt, ob der aktuelle Eintrag kein Verzeichnis ist. Wenn das der Fall ist, wird der Eintrag, also eine Datei, mit unlink
gel�scht. Beim erfolgreichen L�schen wird die Variable $Anzahl
um 1 erh�ht. Am Ende gibt das Script HTML-Code mit der Anzahl der gel�schten Dateien aus.
�ndert den Zeitstempel f�r den letzten Lesezugriff und den letzten Schreibzugriff von einer oder mehreren Dateien.
Erwartet als Parameter:
1. Eine Zeitangabe f�r den letzten Lesezugriff. Es muss sich um eine Sekundenangabe seit dem 1.1.1970 handeln, so wie ihn beispielsweise die Funktion time zur�ckgibt.
2. Eine Zeitangabe f�r den letzten Schreibzugriff. Auch dabei muss es sich um eine Sekundenangabe seit dem 1.1.1970 handeln.
3. eine Liste von Dateien, deren Zeitstempel ge�ndert werden soll.
Gibt die Anzahl der erfolgreich "ber�hrten" Dateien zur�ck.
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser); my $Datei = $ENV{'QUERY_STRING'}; my $Jetzt = time(); utime($Jetzt,$Jetzt,$Datei); print "Content-type: text/html\n\n"; print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n"; print "<html><head><title>Test-Ausgabe</title></head><body>\n"; print "Zeitstempel von $Datei wurde aktualisiert!\n"; print "</body></html>\n";
Das Script aktualisiert den Zeitstempel einer Datei. Beim Aufruf erwartet es einen �bergabeparameter, der beim URI hinter einem Fragezeichen notiert wird. Der �bergabeparameter besteht in der Pfadangabe einer Datei, deren Zeitstempel aktualisiert werden soll. Beispiel:
http://localhost/cgi-bin/test.pl?/mydocs/texte/wichtig.txt
.
Den �bergebenen Parameter speichert das Script in dem Skalar $Datei
. Um den aktuellen Zeitpunkt zu ermitteln, wird die Funktion time
aufgerufen. Sie liefert die Anzahl der Sekunden seit dem 1.1.1970 zur�ck, also genau die Form, die utime
erwartet. Der R�ckgabewert wird in $Jetzt
gespeichert. Nun kann das Script die utime
-Funktion aufrufen und ihr die gew�nschten Parameter �bergeben. Wenn Sie mehr als eine Datei auf einmal verarbeiten m�chten, geben Sie alle gew�nschten Dateien durch Kommata getrennt an.
Anschlie�end erzeugt das Script HTML-Code. Dabei wird das "Ber�hren" der Datei best�tigt.
Nicht alle Betriebssysteme unterscheiden wie Unix zwei verschiedene Zeitstempel. Unter Windows beispielsweise gibt es keinen Zeitstempel f�r den letzten Lesezugriff, nur f�r den letzten Schreibzugriff. �bergeben Sie utime
dennoch immer beide Parameter. Unter Windows wird dann nur der eine vorhandene Zeitstempel ge�ndert.
![]() | |
![]() |
![]() |
![]() |
![]() |
![]() ![]() ![]() |
© 2007 Impressum