improved comparator
[feisty_meow.git] / scripts / files / compare_dirs.sh
1 #!/bin/bash
2
3 # compares the files and directory names in two different top-level directories
4 # and prints a report of the differences.
5
6 dir1="$1"; shift
7 dir2="$1"; shift
8
9 if [ -z "$dir1" -o -z "$dir2" ]; then
10   echo This script needs two directory names for which it will create a
11   echo list of differences in the two directory hierarchies.
12   exit 1
13 fi
14 #if [ ! -d "$dir1/" -o ! -d "$dir2/" ]; then
15 #  echo The directories to be compared must already exist.
16 #  exit 1
17 #fi
18 if [ "$dir1" == "$dir2" ]; then
19   echo "The two directories are the exact same folder name.  So that's silly."
20   exit 1
21 fi
22
23 source "$FEISTY_MEOW_SCRIPTS/core/launch_feisty_meow.sh"
24
25 out1="$(mktemp "$TMP/compare_dirs_output.XXXXXX")"
26 out2="$(mktemp "$TMP/compare_dirs_output.XXXXXX")"
27
28
29 #hmmm: need error checking in here!!!!
30
31
32 # host processing on first dir.
33 if [[ $dir1 == *":"* ]]; then
34   host1=${dir1%:*}
35   dir1=${dir1#*:}
36 #echo "got host1 as $host1 and new dir1 as $dir1"
37 fi
38
39 # host processing on second dir.
40 if [[ $dir2 == *":"* ]]; then
41   host2=${dir2%:*}
42   dir2=${dir2#*:}
43 #echo "got host2 as $host2 and new dir2 as $dir2"
44 fi
45
46 if [ -z "$host1" ]; then
47   # fully local compare location for first dir.
48   pushd "$dir1" &>/dev/null
49   exit_on_error "compare_dirs: seeking directory $dir1"
50   find . >"$out1"
51   popd &>/dev/null
52 else
53   # remote compare location for first dir.
54   ssh "$host1" "cd \"$dir1\" && find ." >"$out1"
55   exit_on_error "compare_dirs: listing remote directory $dir1"
56 fi
57
58 # sort the output from listing the first directory.
59 sort "$out1" >"$out1".sort
60
61 if [ -z "$host2" ]; then
62   # fully local compare location for second dir.
63   pushd "$dir2" &>/dev/null
64   exit_on_error "compare_dirs: seeking directory $dir2"
65   find . >"$out2"
66   popd &>/dev/null
67 else
68   # remote compare location for second dir.
69   ssh "$host2" "cd \"$dir2\" && find ." >"$out2"
70   exit_on_error "compare_dirs: listing remote directory $dir2"
71 fi
72
73 # sort the output from listing the second directory.
74 sort "$out2" >"$out2".sort
75
76 # compare the two sorted output files to show the missing files on each side.
77 diff "$out1".sort "$out2".sort
78
79 # clean up our output files.
80 rm "$out1" "$out1".sort "$out2" "$out2".sort
81