#!/usr/bin/perl use strict; use warnings; # schnell und speicherhungrig my @dirs=qw( /home/shared /home/topeg /home/test /var/log); # erste zeile print ";".join(';',@dirs)."\n"; # alle vorhandenen groups lesen my %gid_list=read_groups(); # alle User finden my %user_list; for my $pos (0..$#dirs) { my $dir=$dirs[$pos]; my $gid=get_gid_for_dir($dir); if(defined($gid) && exists($gid_list{$gid})) { for my $user (@{$gid_list{$gid}}) { $user_list{$user}->[$pos]=1; } } } # alle user Ausgeben for my $user (sort(keys(%user_list))) { print "$user;"; # iste lesen und sicher stellen, dass alle Zeilen geholt werden my @list=@{$user_list{$user}}[0..$#dirs]; # werte auf 1/0 setzen map{$_=$_?1:0}@list; print join(';',@list)."\n"; } ######################################################################## # gid für ein verzeichnis sub get_gid_for_dir { my $dir=shift; my $gid=undef; $gid=(stat($dir))[5] if(-d $dir); return $gid; } # alle user zu einer gid sub read_groups { my $gfile='/etc/group'; my $ufile='/etc/passwd'; my %gid_user; if(-e $gfile && open(my $fh, '<', $ufile)) { while(my $line=<$fh>) { chomp($line); my ($user,undef,$uid,$gid)=split(/:/,$line); push(@{$gid_user{$gid}},$user); } close($fh); } if(-e $gfile && open(my $fh, '<', $gfile)) { while(my $line=<$fh>) { chomp($line); my ($gname,undef,$gid,$user)=split(/:/,$line); push(@{$gid_user{$gid}},split(/,/,$user)); } close($fh); } return %gid_user; }