Backup Directory Hierarchy To CDR/DVDR.
I use this on my /home/music directory, which is 23 GiB.
#!/usr/bin/perl
## Backup Hierarchy.
##
## Version: backup-hierarchy.pl v2005-06-24.
##
## Description: backup a directory hierarchy to a set
## of CDR/DVDRs.
##
## Copyright (c) 2005 Hal Canary.
##
## hal at ups dot physics dot wisc dot edu.
##
## Licence Information:
##
## This program is free software; you can redistribute it
## and/or modify it under the terms of version 2 of the
## GNU General Public License as published by the Free
## Software Foundation.
##
## A copy of the licence can be found at:
## http://www.gnu.org/licenses/gpl.txt
##
## This program is distributed in the hope that it will
## be useful, but WITHOUT ANY WARRANTY; without even the
## implied warranty of MERCHANTABILITY or FITNESS FOR A
## PARTICULAR PURPOSE. See the GNU General Public
## License for more details.
##
## TO DO: Limit symlink filename length to 64 chars.
##
## How to use:
## Change the $backupdir, $startdir, and $originaldir
## variables. Maybe also change the $discsize variable.
##
## After running the program, copy or symlink INDEX.txt
## into each directory. Now you can use a single disc to
## look up files on ALL discs.
##
## If you want to preserve permissions and such, tar up
## the files before burning. "tar --dereference" will
## dereference those symlinks. For backing up music and
## video this is most likey unnessisary.
##
## mkisofs -V "MUSIC 001" -r -J -f -quiet \
## -o MUSIC_001.iso MUSIC_001/
## cdrecord -v -pad -eject MUSIC_001.iso
my $backupdir = "/home/hal/MUSIC_BACKUP"; #abs
my $backupname = "MUSIC" ;
my $startdir = "/home"; #abs
my $originaldir = "music"; #rel
mkdir $backupdir;
#$discsize = 700*1024*1024; # Bytes for CD-R
my $discsize = 4.7*1000*1000*1000; # Bytes for DVD-R
my $num=1;
my $dirnum = &padnum($num);
my $disc = $backupdir."/".$backupname."_".$dirnum;
my $cursize = 0;
mkdir $disc;
chdir $startdir ;
&dealwithdir($originaldir);
chdir $backupdir ;
system ("/bin/ls -shpR . > INDEX.txt");
sub dealwithdir {
my $dir=shift;
mkdir $disc."/".$dir ;
opendir(DH, $dir);
my @contents = readdir(DH);
closedir(DH); #print($dir."\n");
foreach my $file (@contents) {
if (-f $dir . "/" . $file ) {
dealwithfile($dir, $file);
} elsif ( -d $dir . "/" . $file ) {
&dealwithdir ($dir . "/" . $file)
unless ($file eq "."
or $file eq "..");
}
}
}
sub dealwithfile {
my $dir = shift;
my $file = shift;
my $size = (stat($dir."/".$file))[7] ;
$cursize += $size;
if ($cursize > $discsize) {
$num++;
$dirnum = &padnum($num);
$cursize = $size ;
$disc = $backupdir."/"
.$backupname."_".$dirnum;
mkdir $disc;
system( "mkdir -p ".$disc."/".$dir );
}
my $bdir = $disc."/".$dir ;
symlink( $startdir."/".$dir."/".$file ,
$bdir."/".$file )
or die "HELP";
}
sub padnum {
$num=shift;
return "00".$num if $num%lt;10;
return "0".$num if $num%lt;100;
return "$num";
}
file modification time: 2005-06-24 16:44:06