Version 0 of Data recovery script

Updated 2008-04-08 22:09:56 by AndyGaskell
 # this is a script for data recovery from damaged disks
 # it is assumed that it will take several attempts to copy 
 # some of the files from the disk (HDD, DVD or CDR).
 # it should be fine for windows or linux.
 # you just need to set the user variables at the top of the script.
 # Andy G. April 08.

 puts "cdr_recovery.tcl script"

 # user vars
 # the folder to try to copy files from
 set sourcedir "/media/cdrom"
 # the folder to try to copy them to
 set targetdir "/home/andy/980720_1616_linux_s1"
 # the number of time to re-try
 set numits 100

 # util vars
 set count 0
 set totalsize 0

 # create the list of files from a big glob
 set sourcefilelist [ glob -nocomplain -directory $sourcedir  \
 * \
 */* \
 */*/* \
 */*/*/* \
 */*/*/*/* \
 */*/*/*/*/* \
 */*/*/*/*/*/* \
 */*/*/*/*/*/*/* \
 ]

 if  { [ llength $sourcefilelist ] == 0 } {
     puts "no matches"
     exit
 }

 # loop through the file list building up an array with all the info in
 foreach sourcefile $sourcefilelist {
     incr count 
     # build up the data array
     set filearray(sfile,$count) "$sourcefile"
     set filearray(size,$count) "[file size $sourcefile]"
     set filearray(date,$count) "[clock format [file atime $sourcefile] -format "%H:%M:%S %D"]"
     set filearray(trimfile,$count) "[string trimleft $sourcefile "$sourcedir"]"
     set filearray(fileonly,$count) "[file tail $sourcefile]"  
     set filearray(folderonly,$count) "[string trimleft  [file dirname $filearray(sfile,$count)] "$sourcedir" ]"
     set filearray(done,$count) 0

     # print out some general info
     puts "$filearray(sfile,$count)"
     puts "  number - $count"
     puts "  size - $filearray(size,$count) bytes"
     puts "  date - $filearray(date,$count)"
     puts "  trim - $filearray(trimfile,$count)"
     puts "  file - $filearray(fileonly,$count)"
     puts "  dir  - $filearray(folderonly,$count)"

     # keep a running total of all the file's sizes
     set totalsize [ expr $totalsize + $filearray(size,$count) ]
 }

 # save the number of files
 set numfiles $count
 # print some useful sumary info
 puts " "
 puts "total size: $totalsize bytes"
 puts "file count: $numfiles"
 puts " "

 # do them all numits num of times
 for { set it 1 } { $it <= $numits } { incr it } { 
     # loop through the array
     for { set count 1 } { $count <= $numfiles } { incr count } { 
         # if the file is not done already
         if { $filearray(done,$count) == 0 } {
             puts "$filearray(sfile,$count)"
             puts "  number - $count"
             puts "  size - $filearray(size,$count) bytes"
             puts "  date - $filearray(date,$count)"
             puts "  trim - $filearray(trimfile,$count)"
             puts "  file - $filearray(fileonly,$count)"
             puts "  dir  - $filearray(folderonly,$count)"

             # see if the target dir exists
             if { [ file isdirectory $targetdir/$filearray(folderonly,$count) ] == 1 } {
                 puts "  exists: $targetdir/$filearray(folderonly,$count) "
             } else {  
                 puts "  doesnt exist: $targetdir/$filearray(folderonly,$count) "
                 file mkdir "$targetdir/$filearray(folderonly,$count)"
                 puts "  created it"
             } 

             puts "  about to copy:"
             puts "    $filearray(sfile,$count) "
             puts "  to"
             puts "    $targetdir/$filearray(folderonly,$count)"
             if { [ file exists $targetdir/$filearray(trimfile,$count) ] == 1 } {
                 # the file already exists
                 puts "  file already exixts, no need to copy"
                 set filearray(done,$count) 1
             } elseif { [ catch { file copy -force $filearray(sfile,$count) $targetdir/$filearray(folderonly,$count)  } errorvar ] } {
                 # catch an error if there is one, and print details
                 puts "  error: $errorvar"
             } else {
                 # if there is no error, say so, and set done to true
                 puts "  no error, copied ok"
                 set filearray(done,$count) 1
             }
             puts " "
         }
     }
     puts "it $it"
     puts " "
 }

 puts "script complete"


enter categories here