Font
[thread]5647[/thread]

stat() - Was steckt genau im mode Feld?

Reader: 1


<< |< 1 2 >| >> 20 entries, 2 pages
FReAK La Marsch
 2003-08-23 17:24
#76312 #76312
User since
2003-08-14
38 articles
BenutzerIn
[Homepage] [default_avatar]
Hi,
ich bastel an einem Skript, das mir Inhalte von Verzeichnissen anzeigen soll und kämpfe da gerade mit stat.
(oder gibt es einen anderen Weg in Perl um sich den Inhalt eines Verzeichnisses zu holen, als Mittels opendir und dann stat für jedes File?)

Im Feld 2 des stat-Arrays steht eine Zahl, die den Status der Datei anzeigen. Mehr steht dazu leider nicht auf der manpage dazu.

Kann mir jemand genauer sagen, wie sich die Zahl zusammensetzt und wie ich z.B. herausbekomme, ob ich es mit einem File oder einem Verzeichnis zu tun habe?
Bzw. wie die Nutzerrechte gesetzt sind (dazu hab ich Beispiele gefunden mode & 0777 oder so, aber ohne Erklärung des mode-Feldes).

Vielen Dank fürs lesen,
FReAK

P.S.: Je genauer die Erklärung desto besser; ich will ja nicht nur dass es funktioniert, sondern auch lernen warum.
[E|B]
 2003-08-23 17:39
#76313 #76313
User since
2003-08-08
2561 articles
HausmeisterIn
[Homepage] [default_avatar]
Wieso so kompliziert?

Code: (dl )
1
2
3
4
5
if(-d("data")){
print "'data' ist ein Verzeichnis!";
}else{
print "'data' ist eine Datei!";
}


Nutzerrechte:

Code: (dl )
1
2
3
-r: ermittelt, ob der Benutzer über Leserecht verfügt (r = read)
-w: ermittelt, ob der Benutzer über Schreibrecht verfügt (w = write)
-x: ermittelt, ob der Benutzer über Ausführrecht verfügt (x = execute)
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
Crian
 2003-08-23 17:41
#76314 #76314
User since
2003-08-04
5833 articles
ModeratorIn
[Homepage]
user image
Die Modi kommen von Unix. Jeder Modus setzt sich aus drei Oktalziffern zusammen, dann gibt es noch spezielle bedeutungen für die erste Ziffer von 4-stelligen Modi, auf die gehe ich hier mal nicht ein, aber das Grundprinzip ist folgendes: die drei Ziffern stehen von links nach rechts für user gruppe alle, die erste Ziffer gibt die Rechte des Besitzers der Datei an, die zweite Ziffer die rechte der Gruppe, der die Datei gehört, die dritte Ziffer steht für alle anderen User.

Jede Ziffer besteht aus 3 bit, von links nach rechts "Lesen", "Schreiben", "Ausführen".

777 bedeutet: Jeder darf alles

750: Besitzer darf alles, Gruppe darf Lesen und Ausführen, Rest darf gar nichts.

Klar? Oder soll ich noch näher auf Oktalzahlen und die Bedeutungen eingehen?
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
FReAK La Marsch
 2003-08-23 18:30
#76315 #76315
User since
2003-08-14
38 articles
BenutzerIn
[Homepage] [default_avatar]
Hi und danke für die Antworten.

@[E|B] ich will ja nicht nur eine Eigenschaft der Datei testen, sondern alle ausgeben, deshalb nehm ich an, dass es einfacher ist, wenn ich mir alle Eigenschaften mit stat hole und dann nur mit der Zahl rumhantiere, anstatt immer die einzelnen Eigenschaften direkt abfragen.

@Ciran
Die Sache mit den Unix-Rechten kenn ich schon, allerdings liefert mir stat ja nicht z.B. 777, sondern 16895 (zumindest wenn ichs printe).

Woher kommt diese Zahl und vor allem wie komm ich da an die Info obs ne Datei oder ein Verzeichnis ist ran?
Ishka
 2003-08-23 19:37
#76316 #76316
User since
2003-08-04
771 articles
HausmeisterIn
[Homepage] [default_avatar]
perl -e 'printf "%o",16895'
40777

Das ist ne Oktalzahl
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
Strat
 2003-08-23 22:35
#76317 #76317
User since
2003-08-04
5246 articles
ModeratorIn
[Homepage] [default_avatar]
Ich habe das mit den Rechten einfacher verstanden, als mir jemand gesagt hat, ich solle es mir mal auf Binaerbasis vorstellen...

111 101 000

die erste Position einer dreiergruppe steht immer fuer leserechte, die zweite fuer schreiben, und die dritte fuer ausfuehren. die erste dreiergruppe steht fuer den eigentuemer der Datei, die zweite fuer die Gruppenkennung, die die Datei hat, und die dritte fuer den rest der welt (=other)...

111 steht also fuer lesen+schreiben+ausfuehren
101 steht fuer lesen+ausfuehren (nicht schreiben)
000 steht fuer keine rechte

da man die drei stellen auch sehr gut als oktalzahl darstellen kann, kaeme da z.B. 750 heraus...

Code: (dl )
1
2
3
4
5
6
7
8
9
Bin | okt
000 | 0
001 | 1
010 | 2
011 | 3
100 | 4
101 | 5
110 | 6
111 | 7


Alle Klarheiten beseitigt?
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
[E|B]
 2003-08-23 22:54
#76318 #76318
User since
2003-08-08
2561 articles
HausmeisterIn
[Homepage] [default_avatar]
War das ein Witz oder meinst du "Unklarheiten"?
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
esskar
 2003-08-23 23:05
#76319 #76319
User since
2003-08-04
7321 articles
ModeratorIn

user image
[E|B
,23.08.2003, 20:54]War das ein Witz oder meinst du "Unklarheiten"?

das sagt man so...
Strat
 2003-08-23 23:19
#76320 #76320
User since
2003-08-04
5246 articles
ModeratorIn
[Homepage] [default_avatar]
[E|B
,23.08.2003, 20:54]War das ein Witz oder meinst du "Unklarheiten"?

@E|B: ich habe keinerlei Art von Humor, von der ich wuesste...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
FReAK La Marsch
 2003-08-24 13:18
#76321 #76321
User since
2003-08-14
38 articles
BenutzerIn
[Homepage] [default_avatar]
Vielen Dank für die Infos!

Auch wenn mir noch immer keiner verraten hat, wie ich jetzt herausfinde ob ich es mit einer Datei oder einem Verzeichnis zu tun hab.
Aber das finde ich wohl recht schnell durch rumprobieren raus.

Nochmals danke!
FReAK
<< |< 1 2 >| >> 20 entries, 2 pages



View all threads created 2003-08-23 17:24.