#!/usr/bin/perl # # newfiles: examines lists of original and new files # generated by find, prints separate lists of # directories and files which were added. # # usage: added original-files new-files # # example: # % find ./mozilla -print | sort > ORIG.files # [do configure, build, etc.] # % find ./mozilla -print | sort > NEW.files # % ./newfiles ORIG.files NEW.files # % mv dir94926 ADDED.dirs # % mv reg94926 ADDED.files use Fcntl ':mode'; use subs qw(filetype); use strict; use warnings; my $forig = shift (@ARGV) || die "no original filelist"; my $fnew = shift (@ARGV) || die "no new filelist"; # # Read the original list of files. # my %aorig; open (F, "< $forig") || die "$forig: can't read: $!\n"; while () { chomp; $aorig{$_} = 1; } close (F); # # Read the new list of files, and find what's been added. # my %added; open (F, "< $fnew") || die "$fnew: can't read: $!\n"; while () { chomp; $added{$_} = 1 unless defined($aorig{$_}); } close (F); # # Divide added files into directories and anything else. # # Use reverse sort so we can just pipe the directories into # "xargs rmdir" without trying to remove a parent directory # before removing its children. # my $dlist = "dir$$"; my $rlist = "reg$$"; my $mode; my $ft; open (D, "> $dlist") || die "$dlist: can't write: $!\n"; open (R, "> $rlist") || die "$rlist: can't write: $!\n"; foreach (reverse sort keys %added) { ($mode) = (lstat($_))[2]; next unless $mode; $ft = filetype ($mode); if ($ft eq 'd') { print D "$_\n"; } else { print R "$_\n"; } } close (D); close (R); exit (0); sub filetype { my ($mode) = @_; return '-' unless $mode; # just in case stat failed S_ISBLK($mode) && return 'b'; S_ISDIR($mode) && return 'd'; S_ISFIFO($mode) && return 'p'; S_ISLNK($mode) && return 'l'; S_ISREG($mode) && return 'f'; S_ISSOCK($mode) && return 's'; S_ISCHR($mode) && return 'c'; return 'u'; }