#! /usr/bin/perl

#
# Faire le ménage sur des comptes utilisateurs...
#
#  (c) 1995   Vincent Zoonekynd (zoonek@ens-cachan.fr)
#

#
# Tous les fichiers temporaires d éditeurs de textes.
# Des fichiers qui ne devraient peut-être pas être là
#  (core, nohup.out, .nfs3627)
# Les résultats de compilation (La)TeX, C, fortran.
# Les fichiers *.tar non compressés.
# Des images *.ps *.ras non compressées.
#
# On signale simplement la présence d Images ou de sons.
#

# TO DO: 
#  print a short report
#  and then a long one...

######################################################################

eval 'exec /usr/local/snepa/bin/perl -S $0 ${1+"$@"}'
        if $running_under_some_shell;

#die "Not to be used as root (yet)" if (($< == 0) || ($> == 0)) ;

use File::Find ;

sub erase_previous_line {
    print "\r" ;
    print " " x 70 ;
    print "\r" ;
}

sub wanted {

    # Si jamais c'est un lien, on passe...
    # A FAIRE...

    #erase_previous_line() ;
    #print STDERR "Checking $File::Find::name\r" ;

    # L'expérience montre qu'il vaut mieux garder $_ dans un coin...
    $Fichier = $_ ;

    #
    # Les exécutables FORTRAN...
    #

    # On vire l'extension .f
    if( s/\.f$// )
    {
	if (($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size) = lstat($_))
	{
	    unlink($_);
	    @fortran = ( @fortran , "$File::Find::name/$size" ) ;
	}
	return ;
    }

    # Idem avec les exécutables C...
    if( s/\.c$// )
    {
	if (($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size) = lstat($_))
	{
	    unlink($_);
	    @fortran = ( @fortran , "$File::Find::name/$size" ) ;
	}
	return ;
    }

    # S'il y a un Imakefile, on vire Makefile*...
    if( /^[Ii]makefile$/ )
    {
	$_ = "Makefile" ;
	if (($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size) = lstat($_))
	{ unlink($_); }
	$_ = "makefile" ;
	if (($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size) = lstat($_))
	{ unlink($_); }
	return ;
    }
    

    #
    # Fichiers *.tar non compressés...
    #

    if( /\.tar$/ )
    {
	# Pas en tant que root.
	# Il faudrait changer le ruid...
	if (($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size) = lstat($_))
	{ $>=$uid; $)=$(=$gid;    system( "gzip -f $_" ) ; }
	return ;
    }

    #
    # GROS fichiers *.ps *.ras non compressés
    #

    if( /\.(ps|ras)$/ )
    {
	(($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
             ) = lstat($_)) || return ;
	{    
	    if( $size > 100000 )
	    { 
		$>=$uid; $)=$(=$gid;
		system("gzip -f $_") ;
	    }
	}
	return ;
    }

    #
    # Il y aurait aussi les fichiers *.Z
    #

    #
    # Images et sons
    #
    if( /\.(aiff|aif|au|wav|gif|jpg|jpeg|mpg|mpeg|png|ppn|pbm|pgm|tga|tif|tiff|ras)$/i )
    {
	if (($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size) = lstat($_))
	{
	    # unlink($_) ;
	    # erase_previous_line() ;
	    #print "$File::Find::name\n" ;
	    @images = ( @images , "$File::Find::name/$size" ) ;
	}
	return ;
    }

    #
    # Des trucs pour PC ou Mac...
    #
    if( /\.(lha|lhz|zip|bin|com)$/ )
    {
	if (($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size) = lstat($_))
	{
	    #unlink($_) ;
	    @PC = ( @PC , "$File::Find::name/$size" ) ;
	}
	return ;
    }

    #
    # Résultats de compilation (La)TeX
    #
    if( /\.(aux|log|bbl|blg|toc|lof|idx|ilg|ind|nidx|nilg|nind|glo|xyc)$/ )
    {
	(($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size) = lstat($_)) &&
	    unlink($_) ;
	return ;
    }
    if( /^\_region\_/ )
    {
	(($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size) = lstat($_)) &&
	    unlink($_) ;
	return ;
    }
    if( /\.(dvi|ps|ps\.gz)$/ )
    {
	# Vérifions qu'il y a un *.tex correspondant...
	$TeX = $_;
	$TeX =~ s/(dvi|ps|ps\.gz)$// ;
	$TeX .= 'tex' ;
	(($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size) = lstat($TeX)) &&
	    (($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size) = lstat($_)) &&
		unlink($_) ;
	return ;
    }

    #
    # Résultats de compilation C
    #
    if( /\.o$/ )
    {
	(($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
	    unlink($_) ;
	return ;
    } 

    #
    # Divers fichiers temporaires
    #
    if( /(%|~|bak)$/ || /^(core|textedit.*|dead\.letter)$/ )
    {
	(($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
	    unlink($_) ;
	return ;
    }

    #
    # Des choses à virer plus doucement...
    #
    if( /^(nohup\.out|a\.out|y\.tab\.[hc]|lex\.yy\.[ch]|.*\.tab\.[ch])$/ 
       || /^\#.*\#$/ )
    {
	(($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size) = lstat($_)) &&
	    unlink($_) ;
	return ;
    }

    #
    # Des choses à virer TRÈS violemment...
    #
    if( /^\.xvpics$/ )
    {
	(($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size) = lstat($_)) &&
	    system('/bin/rm', '-rf', '.xvpics') ;
	return ;
    }

    #
    # Des fichiers de taille nulle
    #
    (($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
      ) = lstat($_)) || return ;    
    if( $size == 0 )
    {
	#print STDERR "$File::Find::name a une taille nulle\n" ;
####	unlink($_) ;
	@vide = ( @vide , "$File::Find::name/$size" ) ;
    }

    # Voir commentaire en début de procédure...
    $_ = $Fichier ;
    
}

sub Report
{
    return unless @_ ;
	my $total ;
    @liste = @_ ;
    for (@liste)
    {
	#print "$_   " ;
	$size = $fichier = $_ ;
	$fichier =~ s#/[^/]*$## ;
	$size =~ s#.*/## ;
	printf "%10d %s\n", $size, $fichier ;
	$total += $size ;
    }
    print "--- Total: $total octets dans ";
	print $#liste+1 ;
	print " fichiers.\n\n" ;
}
######################################################################

# Traverse desired filesystems
find(\&wanted, '.');

# Print a short report...

print "Fortran:\n" if @fortran ;
Report( @fortran ) ;

print "Images et sons:\n" if @images ;
Report( @images ) ;

print "Trucs pour PC:\n" if @PC ;
Report( @PC ) ;

print "Fichiers vides:\n" if @vide ;
Report( @vide ) ;
