#! /usr/bin/perl # rpmsafe|sort -u|rpmsafereduce >EXCLUDE-FILELIST use Carp; my $IGNORE_D; #$IGNORE_D=1; # Do not backup directory entry itself even if it is missing in rpms. 581692 -> 37998 vs. 44248 use strict; use warnings; sub slashes($) { my($s)=@_; (my $sl=$s)=~tr{/}{}cd; $sl=length $sl; $sl>=1 or carp "<$s>"; return $sl; } my(%d,%f,%t); my $l; while (<>) { chomp; next if $_ eq "/"; carp $_ if m{//}; m{^/} or carp $_; carp $_ if m{/$}; carp "sort -u: $l >= $_" if $l && $l ge $_; $l=$_; my $sl=slashes $_; $d{$_}=$sl if -d; $f{$_}=$sl if -f; s{/[^/]*$}{} or carp $_; $d{$_}=$sl-1 if $IGNORE_D && $_ ne ""; $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 carp "$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 carp "$t: $!"; next if !$ok; for my $d (@d) { delete $f{"$t/$d"}; delete $t{"$t/$d"}; } $f{$t}=slashes $t; $t=~s{/[^/]*$}{} or carp $t; $d{$t}=slashes $t if $IGNORE_D && $t ne ""; $t{$t}=1 if $d{$t}; } } for my $f (sort keys(%f)) { print "$f\n"; }