Newsgroup: it.comp.lang.perl
Titolo: Spazio utilizzato dagli utenti...

Ciao a tutti, è da un po che scandaglio questo NG ma non ho trovato
nessuno con un problema simile al mio dal quale capirci qualcosa di
+...
Passando al problema:
Nella consolle questo comando mi restituisce la dimensione in kb di
ogni singolo file trovato sotto /home/Shared appartenente all' utente
pippo...
find /home/Shared/* -user pippo -ls | awk '{ print $2 }'
La mia idea era quella di fare in perl:
$writeout = 'find /home/Shared/* -user alessandro -ls | awk '{ print $2
}' '> echo FileList.txt'
in modo da poi riesaminare il file FileList.txt ed eseguire la somma
dei valori di ogni singola riga, e ricavare quindi lo spazio utilizzato
da quel determinato utente...
Il problema è che perl quando eseguo:
#!/usr/bin/perl
$writeout = 'find /home/Shared/* -user alessandro -ls | awk '{ print $2
}' ' > echo FileList.txt'
si arrabbia perche credo che trovi un po troppe ' (virgoletta
singola)...
L' output che mi interessa è la seconda colonna che questo comando mi
restituisce:
find /home/Shared/* -user alessandro -ls
Mi potete dare una mano, magari anche consigliandomi il modo di evitare
l' appoggio ad un file temporaneo?
Grazie a tutti!

 da quel determinato utente...
    #!/usr/bin/perl
    my $user = "pippo";
    my $path = "/home/Shared/";
    my $uid = (getpwnam($user))[3];
    my $usage;
    use File::Find;
    find( sub { (stat($_))[4] == $uid && ( $usage += ( -s _ ) ) }, $path );
 
    print int( $usage/1024 );
 
M

 l' appoggio ad un file temporaneo?
...prova cosi', poi magari miglioralo/adattalo.
PS: ovviamente rendilo eseguibile con:
chmod +x nomediquestoprogramma
...e lancialo con:
./nomediquestoprogramma nomeutente
ciao.
# =================================
#!/usr/bin/perl
use strict;
my $sDir = '/home/Shared';
my $sUser = shift @ARGV;
if(!defined($sUser))
{	print STDERR "Uso: $0 nome-utente\n";
	exit(1);
}
my $nSizeKB = 0;
if(open(F, "find '$sDir'/* -user '$sUser' -printf '%k\n'|"))
{	while(<F>)
         {	chomp($_);
		$nSizeKB += int($_);
	}
	close(F);
}
print "Spazio occupato per l'utente '$sUser': $nSizeKB KB\n";
# =================================
-- 
Cybertoldo
Per rispondermi via email, sostituisci moc.liamg con 
gmail.com

     print int( $usage/1024 );


Grazie per tutti i vostri consigli...ora però devo capire bene cosa
fanno questi script...così magari la prossima volta riuscirò ad
arrangiarmi ;-)
Grazie ancora a tutti voi!

 l' appoggio ad un file temporaneo?
Se vuoi ottenere soltanto questo, allora basta un semplice one-liner,
ovvero un comando (composto) che puoi lanciare dalla linea di comando,
senza neanche essere costretto a salvarti uno script Perl:
find /home/Shared/* -user alessandro -ls |
perl -e '$sum+=(split)[1] for <>; print "$sum\n"'
(ricongiungi tutto su un'unica riga).
Ma se proprio vuoi lo script Perl, le cose sono altrettanto semplici:
#!/usr/bin/perl
$sum += (split)[1] for `find /home/Shared/* -user alessandro -ls`;
print "$sum\n";
Questa soluzione costituisce un'alternativa rispetto a quella proposta
da Max M., la quale rispetto a questa ha il vantaggio di *non* dipendere
da un comando esterno (find), risultando quindi piů portabile (ed anche
piů elegante e perfino piů efficiente).
Ciao, Emanuele.
-- 
What does VISTA mean?
Viruses, Infections, Spyware, Trojan horses & Adware.

fermatevi...la mia conoscenza di perl non riesce a starvi dietro :-)
Si comunque voglio fare tutto dentro a perl perchè poi i dati li
inserisco in un RRD...

 inserisco in un RRD...
Beh, l'RRD in sé non è cruciale per la scelta; diciamo che se, in 
generale, devi inserire quello snippet in un'applicazione più grande (in 
particolare poi se devi ottemperare a requisiti di portabilità su 
diversi SO), la strada indicata da Max M. è di gran lunga la più corretta.
Ciao, Emanuele.