home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 0 / 0978 < prev    next >
Internet Message Format  |  1990-12-28  |  3KB

  1. From: jv@squirrel.mh.nl (Johan Vromans)
  2. Newsgroups: comp.lang.perl,alt.sources
  3. Subject: directory clusters
  4. Message-ID: <4438@mhres.mh.nl>
  5. Date: 5 Mar 90 14:18:20 GMT
  6.  
  7. I usually maintain several releases of programs on-line, and find the
  8. following program very useful.
  9.  
  10. It inspects the contents of two directories, and links files which are
  11. identical. This cuts down on the disk usage without losing
  12. information.
  13.  
  14. For example: suppose you have two directories called NEW and OLD, with the
  15. following files:
  16.     NEW/one        OLD/one        same name, but different
  17.     NEW/two        OLD/two        same contents
  18.     NEW/three    OLD/four    unique
  19.  
  20. Then running lndir.pl will remove NEW/two and replace it by a link to
  21. OLD/two. The other files will be untouched.
  22.  
  23. Multiple directories can be clustered, e.g.:
  24.  
  25.     lndir perl3.0.4 perl3.0.0
  26.     lndir perl3.0.6 perl3.0.4
  27.     lndir perl3.0.8 perl3.0.6
  28.     lndir perl3.0.12 perl3.0.8
  29.  
  30. etc. Specify the new directory first.
  31.  
  32. Have fun!
  33. Comments are welcome - send them to jv@mh.nl .
  34.  
  35. ------ start of lndir.pl -- ascii -- complete ------
  36. #!/usr/bin/perl
  37. #
  38. #    @(#)lndir.pl    1.4
  39. #
  40. # Compare two directories, and link all files which are identical.
  41. # For a cluster of directories, specify the NEW directory first
  42. #
  43. # It is not recursive (yet).
  44. #
  45. # This program requires Perl version 3.0, patchlevel 8 or later.
  46.  
  47. # Check args && fetch names.
  48. if ( $#ARGV != $[ + 1 
  49.     || (!( -d ($newdir = shift(@ARGV)) && -d ($refdir = shift(@ARGV))))) {
  50.   print STDERR "Usage: $0 new-dir ref-dir\n";
  51.   exit 1;
  52. }
  53.  
  54. # Get all files in the new dir. Use readdir since it is faster than
  55. # globbing, but also because we need to include .-files.
  56. opendir (newdir, $newdir) || die "$!: $newdir\nStopped";
  57. @all = readdir (newdir);
  58. closedir (newdir);
  59.  
  60. $|=1;
  61.  
  62. for $file ( @all ) {
  63.   $ok = 1;
  64.  
  65.   # Get stat info for both files
  66.   @stat1 = stat("$newdir/$file");
  67.   if ($#stat1 < $[) {        #];
  68.     printf "$newdir/$file ... $! - skipped\n";
  69.     $ok = 0;
  70.   }
  71.   @stat2 = stat("$refdir/$file");
  72.   if ($#stat2 < $[) {        #];
  73.     printf "$refdir/$file ... $! - skipped\n";
  74.     $ok = 0;
  75.   }
  76.   next unless $ok;
  77.  
  78.   printf "$newdir/$file ... ";
  79.   if ( ! -f "$newdir/$file" ) {
  80.     printf "not a plain file - skipped\n";
  81.     next;
  82.   }
  83.   if ( ! -f "$refdir/$file" ) {
  84.     printf "not in $refdir\n";
  85.     next;
  86.   }
  87.  
  88.   # Quick check on size, if equal: use cmp
  89.   if (($stat1[7] != $stat2[7])
  90.       || system ("cmp -s $newdir/$file $refdir/$file")) {
  91.     printf "differ\n";
  92.     next;
  93.   }
  94.  
  95.   # Already linked? Compare dev/inode numbers
  96.   if (($stat1[0] == $stat2[0]) && ($stat1[1] == $stat2[1])) {
  97.     printf "identical to $refdir/$file\n";
  98.     next;
  99.   }
  100.  
  101.   # Okay, let's link
  102.   if (unlink ("$newdir/$file") && link ("$refdir/$file", "$newdir/$file")) {
  103.     printf "linked to $refdir/$file\n";
  104.     next;
  105.   }
  106.  
  107.   printf "$!\n";
  108. }
  109. ------ end of lndir.pl -- ascii -- complete ------
  110. Johan Vromans                       jv@mh.nl via internet backbones
  111. Multihouse Automatisering bv               uucp: ..!{uunet,hp4nl}!mh.nl!jv
  112. Doesburgweg 7, 2803 PL Gouda, The Netherlands  phone/fax: +31 1820 62944/62500
  113. ------------------------ "Arms are made for hugging" -------------------------
  114.