--- /dev/null
+#! /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";
+}