Perl: Filemode auslesen, ohne Datei zu öffnen?
Perl: Filemode auslesen, ohne Datei zu öffnen?
Hi alle!
Im perldoc hab ich nur stat() gefunden, aber das erwartet den Handle einer offenen Datei. Da meine Dateiliste ein wenig länger ist, möchte ich die Dateien eigentlich nur ungern alle öffnen, um den Filemode (der mit chmod gesetzt wird) abzufragen. Weis jemand, ob man den Filemode auch bei einer ungeöffneten Datei herausbekommen kann?
Danke schonmal
Im perldoc hab ich nur stat() gefunden, aber das erwartet den Handle einer offenen Datei. Da meine Dateiliste ein wenig länger ist, möchte ich die Dateien eigentlich nur ungern alle öffnen, um den Filemode (der mit chmod gesetzt wird) abzufragen. Weis jemand, ob man den Filemode auch bei einer ungeöffneten Datei herausbekommen kann?
Danke schonmal
Re: Perl: Filemode auslesen, ohne Datei zu öffnen?
Gibt sicher wieder irgendein Modul dafür, fällt mir aber gerade auch nichts ein. Ansonsten die Hardcore Methode: ls parsen und von dort die entsprechenden Rechte auslesen. Könntest den Output von ls in eine Datei umleiten und dann nur mit dieser EINEN Datei arbeiten. Das dürfte auch recht resourcensparend vonstatten gehen.
-
olaf.dietsche
- Posts: 401
- Joined: 2002-12-19 02:06
- Location: Siegburg
Re: Perl: Filemode auslesen, ohne Datei zu öffnen?
Code: Select all
man perlfunc
...
stat FILEHANDLE
stat EXPR
stat Returns a 13-element list giving the status info for a file, either the
file opened via FILEHANDLE, or named by EXPR. If EXPR is omitted, it
stats $_. Returns a null list if the stat fails. Typically used as
follows:
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,$blocks)
= stat($filename);
...Re: Perl: Filemode auslesen, ohne Datei zu öffnen?
Aber das wäre doch genau die Sache, dass dem zu untersuchenden File ein Handle zugeordnet sein muss und demnach müsste schon jede Datei mehr oder weniger geöffnet sein
Re: Perl: Filemode auslesen, ohne Datei zu öffnen?
Hm, stimmt, mittels ls wäre natürlich eine Möglichkeit. Ich versuch's mal. Danke!
-
olaf.dietsche
- Posts: 401
- Joined: 2002-12-19 02:06
- Location: Siegburg
Re: Perl: Filemode auslesen, ohne Datei zu öffnen?
Macht sich eigentlich irgend wer die Mühe das Manual zu lesen und auszuprobieren, was da steht? Also, noch mal im Klartext: stat EXPR ... or named by EXPR.
Kein ls nötig, keine Umwege, einfach nur den Dateinamen als Parameter übergeben.
Code: Select all
my @s = stat('/etc/fstab');
print "@sn";Re: Perl: Filemode auslesen, ohne Datei zu öffnen?
Olaf, danke für deine Hilfe.
Wenn du jedoch meine Frage richtig gelesen hättest, wäre dir aufgefallen, das ich stat() schon dort (im 1. Statz) erwähnt hatte, und eine Benutzung der Funktion zunächst ausgeschlossen habe, da sie ein Filehandle benötigt (d.h., die Datei muß geöffnet werden). Da ich eine große Anzahl von Dateien (möglicherweise einige 100) bei jedem Aufruf abarbeiten möchte, denke ich, daß es hier zu unnötigen Verzögerungen kommt. Wenn dies nicht so sein sollte, wäre ich für eine entsprechende Info dankbar.
Trotzdem danke für die Hilfe.
Wenn du jedoch meine Frage richtig gelesen hättest, wäre dir aufgefallen, das ich stat() schon dort (im 1. Statz) erwähnt hatte, und eine Benutzung der Funktion zunächst ausgeschlossen habe, da sie ein Filehandle benötigt (d.h., die Datei muß geöffnet werden). Da ich eine große Anzahl von Dateien (möglicherweise einige 100) bei jedem Aufruf abarbeiten möchte, denke ich, daß es hier zu unnötigen Verzögerungen kommt. Wenn dies nicht so sein sollte, wäre ich für eine entsprechende Info dankbar.
Trotzdem danke für die Hilfe.
Re: Perl: Filemode auslesen, ohne Datei zu öffnen?
Ja, Olaf du hast schon Recht, dass ich vielleicht etwas genauer hätte lesen sollen. Habe gerade noch mal ein Blick in "Programmieren mit Perl" geworfen und dort wurdest du bestätigt. Ist nur die Frage, wie die Funktion stat mit der Ã?bergabe einer EXPR intern arbeitet.
Glaubst du die Perl Funktion stat arbeitet effektiver als ein gegrepptes ls aus dem man dann via RegExp die Rechte ausließt?
Glaubst du die Perl Funktion stat arbeitet effektiver als ein gegrepptes ls aus dem man dann via RegExp die Rechte ausließt?
Re: Perl: Filemode auslesen, ohne Datei zu öffnen?
Anstatt hier zu spekulieren, wie die Perl Internals aussehen, und wie was funktioniert sollte man es vielleicht mal ausprobieren.
Baut doch einfach mal ein Script, dass beide Möglichkeiten mit der selben Datengrundlage durchgeht, lasst euch doch mal nicht von so vielen (überflüssigen) Vorüberlegungen aufhalten.
Tipp: Mit dem Modul Time::HiRes kann man Zeitspannen von Millisekunden messen :)
Baut doch einfach mal ein Script, dass beide Möglichkeiten mit der selben Datengrundlage durchgeht, lasst euch doch mal nicht von so vielen (überflüssigen) Vorüberlegungen aufhalten.
Tipp: Mit dem Modul Time::HiRes kann man Zeitspannen von Millisekunden messen :)
-
olaf.dietsche
- Posts: 401
- Joined: 2002-12-19 02:06
- Location: Siegburg
Re: Perl: Filemode auslesen, ohne Datei zu öffnen?
Wenn du ein ls startest, muß der aktuelle Prozess ein fork() und exec() machen. D.h. es wird komplett neuer Prozess von der Platte geladen und ausgeführt. Das ist immer sehr viel teurer, als ein einfacher Systemcall. Außerdem kann ls auch nichts anderes tun, als entweder stat() oder fstat() aufrufen.tuxyso wrote:Ist nur die Frage, wie die Funktion stat mit der Ã?bergabe einer EXPR intern arbeitet.
Glaubst du die Perl Funktion stat arbeitet effektiver als ein gegrepptes ls aus dem man dann via RegExp die Rechte ausließt?
In "man 2 stat" wirst du sehen, daß es neben stat() und lstat() auch ein fstat() gibt. Dieses fstat() ist dasjenige, welches ein Filehandle benötigt. stat() hingegen arbeitet mit einem Dateinamen. Es gibt also einen Systemcall, der genau das bietet, was gewünscht war.
Wie Perl intern arbeitet weiß ich nicht, dafür müsste ich mir etwa 10MB komprimierte Quelltexte ansehen und das werde ich heute bestimmt nicht mehr tun ;-)