Perl: Filemode auslesen, ohne Datei zu öffnen?

Bash, Shell, PHP, Python, Perl, CGI
c14l
Posts: 31
Joined: 2002-12-24 09:37

Perl: Filemode auslesen, ohne Datei zu öffnen?

Post by c14l »

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
tuxyso
Posts: 38
Joined: 2003-05-21 08:24

Re: Perl: Filemode auslesen, ohne Datei zu öffnen?

Post by tuxyso »

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?

Post by olaf.dietsche »

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);

...
tuxyso
Posts: 38
Joined: 2003-05-21 08:24

Re: Perl: Filemode auslesen, ohne Datei zu öffnen?

Post by tuxyso »

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
c14l
Posts: 31
Joined: 2002-12-24 09:37

Re: Perl: Filemode auslesen, ohne Datei zu öffnen?

Post by c14l »

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?

Post by olaf.dietsche »

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.

Code: Select all

my @s = stat('/etc/fstab');
print "@sn";
Kein ls nötig, keine Umwege, einfach nur den Dateinamen als Parameter übergeben.
c14l
Posts: 31
Joined: 2002-12-24 09:37

Re: Perl: Filemode auslesen, ohne Datei zu öffnen?

Post by c14l »

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.
tuxyso
Posts: 38
Joined: 2003-05-21 08:24

Re: Perl: Filemode auslesen, ohne Datei zu öffnen?

Post by tuxyso »

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?
rob
Posts: 82
Joined: 2002-06-03 21:53
Location: Brandenburg

Re: Perl: Filemode auslesen, ohne Datei zu öffnen?

Post by rob »

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 :)
olaf.dietsche
Posts: 401
Joined: 2002-12-19 02:06
Location: Siegburg

Re: Perl: Filemode auslesen, ohne Datei zu öffnen?

Post by olaf.dietsche »

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?
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.

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 ;-)