Toon posts:

[perl] opendir

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik wil in een directory kijken of de files directories zijn of gewone files.
Dit gebeurd met onderstaande :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
      print "Contents of the current directory:\n";
      opendir DH, "../" or die "Could not open mp3";

      while ($_ = readdir(DH) )
      {
            next if $_ eq "." or $_ eq "..";
            print $_;
            print "\tdir" if( -d $_ );
           print "\tfile" if -f _;
            print "\t";
            print -s _ if -r and -f _;
            print "\n";
      }
      closedir(DH);
}

Voor sommige dirs gaat dit goed, maar meestal niet
bv voor deze dir :

drwxrwxrwx 4 Temmink root 4096 apr 5 01:55 .
drwxr-xr-x 13 root root 4096 mrt 24 01:18 ..
drwxrwxrwx 3 Temmink root 4096 apr 5 02:08 arno
drwxr-xr-x 2 root root 4096 apr 5 01:47 arno2
-rw-r--r-- 1 root root 0 mrt 30 01:34 lib.pl
-rwxr--r-- 1 root root 1349 apr 5 01:45 list.pm
-rwxrwxrwx 1 root root 137 apr 2 11:51 mp3.pl
-rwxr-xr-x 1 root root 268 mrt 24 00:22 printenv
-rwxr-xr-x 1 root root 14662 mrt 27 13:51 test1.mp3
-rwxr-xr-x 1 root root 16752 mrt 27 13:51 test2.mp3
-rw-r--r-- 1 root root 0 apr 2 23:28 test2.pl
-rwxrw-rw- 1 Temmink Temmink 0 apr 2 23:29 test3
-rw-rw-r-- 1 Temmink Temmink 7 apr 5 00:29 testarno.pl
-rwxr-xr-x 1 root root 757 mrt 24 00:22 test-cgi
-rwxr--r-- 1 Temmink root 389 apr 2 12:12 testdir.pl
-rw-r--r-- 1 root root 521 mrt 29 23:53 testmp3.pl
-rwxr-xr-x 1 root root 3601 mrt 27 13:51 test.pl
-rw-r--r-- 1 root root 5 apr 5 00:28 testroot.pl
-rw-r--r-- 1 Temmink Temmink 8350342 mrt 29 23:27 totalScience.mp3

krijg ik deze output.

Contents of the current directory:
test1.mp3
printenv
test-cgi
test2.mp3
test.pl file 0
totalScience.mp3
testmp3.pl
testdir.pl file 389
lib.pl file 0
mp3.pl file 158
list.pm file 2079
arno
arno2
test2.pl
test3
testroot.pl file 0
testarno.pl file 9

Heeft iemand een idee waarom niet alle files als file worden gezien, en ook directories niet? Aan de rechten kan het volgens mij niet liggen.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Hmm, hier werkt 't prima. Geen idee van mijn kant dus. Sorry!

  • Juup
  • Registratie: Februari 2000
  • Niet online
Gebeurd moet zijn gebeurt
Anyway, probeer dit eens:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
print "Contents of the current directory:\n";
my $dir = '..';
opendir (DH, $dir) || die "Could not open mp3: $!";
while (defined(readdir(DH)))
{
  if (($_ eq ".") || ($_ eq "..")) next;
  print $_;
  if (-d "$dir/$_")
  {
    print "\tdir";
  }
  if (-f "$dir/$_")
  {
    print "\tfile";
  }
  print "\n";
}
closedir (DH);

Je moet bij het testen of het een file of een dir of een symbolic link of whatever is wel het pad goed hebben natuurlijk. Persoonlijk vind ik je stijl trouwens erg ehh... onoverzichtelijk (rommeltje)

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


Verwijderd

Een (compleet nutteloze :P) one-liner die bijna* hetzelfde doet voor files en directories in de huidige directory (linebreak voor de layout):
code:
1
2
perl -e
'print"$_\t",-d$_?"dir\n":("file\t",-s,"\n")for(grep{-d||-f}<*>)'

* Toevoegen van -r of werkend maken voor andere directories is een oefening voor de lezer. >:) :P

  • tomato
  • Registratie: November 1999
  • Niet online
Arien:
Mag er dan wel een
code:
1
sort{-f$a<=>-f$b}

tussen om het wat overzichtelijker te maken en een
code:
1
' 'for(1..30-length)

in plaats van de tabs die niet goed uitkomen bij lange bestandsnamen? ;)

[edit]
Want
code:
1
sort{(-f$a<=>-f$b)||($a cmp $b)}

lijkt onder win32 niet nodig te zijn.

Verwijderd

tomato: Mag er dan wel een
code:
1
sort{-f$a<=>-f$b}

tussen om het wat overzichtelijker te maken?
Hm? Je bedoelt denk ik dit?
code:
1
2
3
perl -e
'print"$_\t",-d$_?"dir\n":("file\t",-s,"\n")
for(sort{lc$a cmp$b}grep{-d||-f}<*>)'
En een
code:
1
' 'for(1..30-length)

in plaats van de tabs die niet goed uitkomen bij lange bestandsnamen? ;)
Jij kent printf niet? :P
code:
1
2
3
perl -e
'printf"%-40s %-5s %s\n",$_,-d$_?"dir":("file",-s)
for(sort{lc$a cmp$b}grep{-d||-f}<*>)'

One-liner wordt zo wel een rekbaar begrip... :+
code:
1
sort{(-f$a<=>-f$b)||($a cmp $b)}

lijkt onder win32 niet nodig te zijn.
Wat zou dat eerst gedeelte van die sort moeten doen? :?

  • tomato
  • Registratie: November 1999
  • Niet online
Arien: Jij kent printf niet? :P
Da's inderdaad een stuk makkelijker :D
One-liner wordt zo wel een rekbaar begrip... :+
Ach, soms worden enorme programma's als 'one-liner' aangeduid als iemand het achter een -e zet :+
Wat zou dat eerst gedeelte van die sort moeten doen? :?
Directories bovenaan zetten lijkt me :?

Sorteren op bestands- en directorynaam gebeurt hier al automagisch (maar het zou goed kunnen dat dat op andere platformen niet zo is).

Combinatievaccin zou volgens mij dan zo kunnen luiden (eerst op file-dir dan op naam):
code:
1
sort{(-f$a<=>-f$b)||($a cmp $b)}

[edit]
En inderdaad eventueel natuurlijk een lc voor bij de compare functie ;)

Verwijderd

tomato: Sorteren op bestands- en directorynaam gebeurt hier al automagisch (maar het zou goed kunnen dat dat op andere platformen niet zo is).
Hier ook automagisch en anders zijn er ook nog backticks en shell commando's om die listing gesorteerd te krijgen. ;)

Hmm... Dan kan je natuurlijk ook die listing bewerken en weergeven... :P
Pagina: 1