Schlagwort-Archive: Perl

find_dupes.pl

`

############################################################
# find_dupes.pl: Welche evtl. identischen Dateien habe ich?
############################################################
use strict;
use File::Find;

my %CheckedSums;
my @xxlFiles;
my $too_large = 20000000;
my $Newline = "\n";
############################################################
# Ausgabe: Ergebnisliste
############################################################
sub print_dupes
{
	my $trennlinie = "-" x 20 . "$Newline";
	print "Dateien wurden untersucht.$Newline";
	print "Möglicherweise identisch:$Newline", $trennlinie;
	my $keine = "(Keine identischen Dateien gefunden.)$Newline" . $trennlinie;

	for(sort keys %CheckedSums)	
	{
		if(scalar split("$Newline", $CheckedSums{$_} ) > 1)
		{
			print $CheckedSums{$_}, $trennlinie;
			$keine = "$Newline";
		}
	}
	print $keine;
	if(scalar @xxlFiles > 1)
	{
	print "${Newline}Folgende ", scalar @xxlFiles,
	" Dateien wurden nicht verglichen, weil sie sehr gross sind:";
	print $trennlinie;
	print join("$Newline", @xxlFiles), "$Newline";

	}
}

############################################################
# Checksumme ermitteln
############################################################

sub checksum_file
{
	local $/; # Slurp-Mode - ganze Datei einsaugen, nicht zeilenweise
	open my $handle, $_ or return -1;
	my $retval = unpack("%32C*", <$handle>) % 65535;
	close $handle;
	return $retval;
}

############################################################
# Groessen+Summen feststellen + in Ergebnisliste schreiben
############################################################
sub check_files
{
	unless (-f)
	{
	# bei Verzeichnissen abbrechen
	return;
	}

	# Eigenschaften der gefundenen Datei auslesen
	my ($dev, $inode, $mode, $numlinks, $uid, $gid, $rdev, $size, $whatever)
	= stat($_) or return;

	unless($size <= 0 || $size > $too_large)
	{
		my $checksum = checksum_file($_);
		unless($checksum < 0)
		{
			my $CheckID = sprintf("%032d %032d", $size, $checksum);
			$CheckedSums{$CheckID} .= $File::Find::name . "$Newline";
		}
	}

	if($size > $too_large)
	{
		push(@xxlFiles, $File::Find::name);
	}

}

############################################################
# Hauptprogramm
############################################################

if ($#ARGV < 0)
{
	die "Bitte mindestens einen Pfad angeben!$Newline";
}

for(@ARGV)
{
	chomp;

	if(! -d)
	{
	print "$_ wurde nicht gefunden oder ist kein Verzeichnis.$Newline$Newline";
	next;
	}
	find(\&check_files, $_);
	print_dupes();
}

############################################################
# EOF
############################################################
`

extcnt.pl

Eine kleine Spielerei, um festzustellen, mit welchen Dateitypen man sich grad seine Festplatte vollgemüllt hat:

`
############################################################
# extcnt.pl: Welche Dateitypen verbrauchen wieviel Plattenplatz?
############################################################
use strict;
use File::Find;

my $Bytes;
my %ExtSizes;

############################################################
# Ausgabe: Abschnittsüberschrift
############################################################
sub print_head
{
	print "-" x 46, "\n";
	print $_, "\n";
	printf("%-22s  %22s\n", "Dateiendung", "Bytes");
	print "-" x 46, "\n";
}

############################################################
# Ausgabe: Ergebnisliste
############################################################
sub print_body
{
	 for(sort { $ExtSizes{$a} <=> $ExtSizes{$b} } keys %ExtSizes)
	 {
		my $endung = $_;
		my $verbrauch = $ExtSizes{$_};
		printf("%-22s  %22s\n", $endung, $verbrauch);
	 }
}

############################################################
# Ausgabe: Ergebnisabschluss
############################################################
sub print_tail
{
	print "-" x 46, "\n";
	printf("%-22s  %22s\n\n", "Summe:", $Bytes);	
}

############################################################
# Dateiendung feststellen
############################################################
sub get_extension
{
	my $fileext = $_;
	
	if($_ =~ /\./)
	{
		# Juhu! Eine Datei mit .irgendwas dran.
		$fileext =~ s/.*\.([^.]*)$/$1/; 
		$fileext = lc($fileext);
	}
	else
	{
		# Irgendwas ohne gescheite Extension
		$fileext = 'Ohne Endung';
	}
}

############################################################
# Dateigroessen feststellen + in Ergebnisliste schreiben
############################################################
sub extcount
{
	unless (-f) 
	{
		# bei Verzeichnissen abbrechen 
		return
	}; 
	
    my $fileext = get_extension();
    	
	# Eigenschaften der gefundenen Datei auslesen
	my ($dev, $inode, $mode, $numlinks, $uid, $gid, $rdev, $size, $whatever)
	= stat($_) or return;

	$Bytes += $size;               # Gesamtverbrauch aller Dateien
	$ExtSizes{$fileext} += $size;  # Verbrauch fuer diese Endung
}

############################################################
# Hauptprogramm
############################################################
if ($#ARGV < 0) 
{
	die "Bitte mindestens einen Pfad angeben!\n";
}

for(@ARGV)
{	
	$Bytes=0;          # in jedem Verzeichnis bei 0 anfangen
	undef %ExtSizes;   # Leere Ergebnisliste

	chomp;	
	
	if(! -d) 
	{
		print "$_ wurde nicht gefunden oder ist kein Verzeichnis.\n\n";
		next;
	}
	
	find(\&extcount, $_);
	
	if($Bytes)
	{
    	print_head();
    	print_body();		
    	print_tail();
	}
}

############################################################
# EOF
############################################################
`