#! /usr/bin/perl # rpmsafe|sort -u|rpmsafereduce >EXCLUDEFILE use strict; use warnings; sub slashes($) { my($s)=@_; (my $sl=$s)=~tr{/}{}cd; $sl=length $sl; $sl>=1 or die $_; return $sl; } my(%d,%f,%t); my $l; while (<>) { chomp; next if $_ eq "/"; die $_ if m{//}; m{^/} or die $_; die $_ if m{/$}; die "sort -u: $l >= $_" if $l && $l ge $_; $l=$_; my $sl=slashes $_; $d{$_}=$sl if -d; $f{$_}=$sl if -f; s{/[^/]*$}{} or die $_; $t{$_}=1 if $d{$_}; } my $time; while (%t) { my @t=keys(%t); %t=(); #warn((@t+0)."\n"); @t=sort { ($f{$b}||$d{$b}) <=> ($f{$a}||$d{$a}) || $a cmp $b; } @t; while (@t) { if (defined $time&&time()!=$time) { $time=time(); print STDERR (@t+0)." \r"; } my $t=shift @t; next if !$d{$t}&&!$f{$t}; opendir DIR,$t or die "$t: $!"; my $ok=1; local $_; my @d; for my $d (readdir DIR) { push @d,$d; next if $d eq "."; next if $d eq ".."; next if $f{"$t/$d"}; next if $d{"$t/$d"}; $ok=0; last; } closedir DIR or die "$t: $!"; next if !$ok; for my $d (@d) { delete $f{"$t/$d"}; delete $t{"$t/$d"}; } $f{$t}=slashes $t; $t=~s{/[^/]*$}{} or die $t; $d{$t}=slashes $t; $t{$t}=1; } } for my $f (sort keys(%f)) { print "$f\n"; }