#!/bin/bash # Recursively look at paths for files and make sure they # are in the large partition. In other words, verify # a many-to-one copy. # # Helps when consolidating data or migrating. Change # variables below to use. # # Bryan Smith - 2008 # Add directories to check. Each directory must have a # unique index, e.g., # Directories[0]="/my/first/path" # Directories[1]="/my/second/path" declare -a Directories Directories[0]="/media/sda1/ProteomeCommons.org-Tranche/data" Directories[1]="/media/sdb1/ProteomeCommons.org-Tranche/data" Directories[2]="/media/sdc1/ProteomeCommons.org-Tranche/data" Directories[3]="/media/sdd1/ProteomeCommons.org-Tranche/data" Directories[4]="/media/sde1/ProteomeCommons.org-Tranche/data" Directories[5]="/media/sdf1/ProteomeCommons.org-Tranche/data" Directories[6]="/media/sdg1/ProteomeCommons.org-Tranche/data" Directories[7]="/media/sdh1/ProteomeCommons.org-Tranche/data" Directories[8]="/media/sdi1/ProteomeCommons.org-Tranche/data" Directories[9]="/media/sdj1/ProteomeCommons.org-Tranche/data" # The target directory, which should have all the files in # above directories. Target="/media/sdl1/ProteomeCommons.org-Tranche/data" # All escaping is a relic of old design, does nothing. EscapePattern='s/\//|/g' UnescapePattern='s/|/\//g' # Some counters to get overview of any problems TotalMismatchesDirectoryToFile=0 TotalMismatchesSize=0 TotalMissingFiles=0 Errors=0 for Directory in ${Directories[@]} do DateString=`date` echo echo "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=" echo "= Checking $Directory" echo "= Started at $DateString" echo "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=" EscapedDirectory=`echo $Directory | sed $EscapePattern` Files=`find $Directory -type f -print` for FullPathFile in ${Files} do EscapedFile=`echo $FullPathFile | sed $EscapePattern` RelativeNameFile=`echo $EscapedFile | sed "s/$EscapedDirectory//"` #echo "DEBUG> RelativeNameFile = $RelativeNameFile" CompareEscapedDirectory=`echo $Target | sed $EscapePattern` CompareEscapedFile="$CompareEscapedDirectory$RelativeNameFile" UnescapedFile=`echo $EscapedFile | sed $UnescapePattern` CompareUnescapedFile=`echo $CompareEscapedFile | sed $UnescapePattern` #echo "DEBUG> Comparing $CompareUnescapedFile to $UnescapedFile" if [ ! -e $CompareUnescapedFile ]; then echo "Warning: file missing at $CompareUnescapedFile" TotalMissingFiles=`expr $TotalMissingFiles + 1` else # Make sure they are both of same type if [ -d $UnescapedFile ]; then if [ -f $CompareUnescapedFile ]; then echo "Warning: $CompareUnescapedFile is a regular file and $UnescapedFile is a directory" TotalMismatchesDirectoryToFile=`expr $TotalMismatchesDirectoryToFile + 1` fi elif [ -f $UnescapedFile ]; then if [ -d $CompareUnescapedFile ]; then echo "Warning: $CompareUnescapedFile is a directory and $UnescapedFile is a regular file" TotalMismatchesDirectoryToFile=`expr $TotalMismatchesDirectoryToFile + 1` else # Compare file sizes FileSize=`du -sb $UnescapedFile | sed "s/\s.*//"` CompareFileSize=`du -sb $CompareUnescapedFile | sed "s/\s.*//"` if [ $FileSize -ne $CompareFileSize ]; then echo "Warning: Mismatch between size of $UnescapedFile [$FileSize] versus $CompareUnescapedFile [$CompareFileSize]" TotalMismatchesSize=`expr $TotalMismatchesSize + 1` fi fi else # Do nothing echo "ERROR: $UnescapedFile is neither a file nor a directory!?!" Errors=`expr $Errors + 1` fi fi #done # Iterating each target directory, recursively done # Iterating each file in directory done # Iterating each directory, recursively searching # for regular files echo "~ fin ~" echo " Total missing files in target directory: $TotalMissingFiles" echo " Total regular files compared to directories: $TotalMismatchesDirectoryToFile" echo " Total files with wrong size: $TotalMismatchesSize" echo " Total unexplained errors: $Errors"