diff options
Diffstat (limited to 'bin/duplicate.sh')
| -rwxr-xr-x | bin/duplicate.sh | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/bin/duplicate.sh b/bin/duplicate.sh new file mode 100755 index 0000000..655aff2 --- /dev/null +++ b/bin/duplicate.sh @@ -0,0 +1,70 @@ +#!/bin/bash + +# Example usage, find all doubles in all sub directory +# for i in *; do if [ -d $i ]; then double.sh $i; fi; done +# +# To find duplicates in specific directory +# double.sh /path/to/dir /path/to/other/dir ./relativ/path +# +# With zero paramater, the script uses the working diroctory. + +DATABASE="/tmp/double.db" +DIR="./found_doubles" +COUNT=0 + +if [ $# -eq 0 ]; then + LOOP=false +else + LOOP=true +fi + +echo "" + +while true; do + + if [ $LOOP = true ]; then + if [ ! -d "$1" ]; then + echo "Can't chdir to $1." + exit 1 + else + echo "Changing directory to '$1'." + cd "$1" + shift + fi + else + echo "Working in directory '$(pwd)'." + fi + + sqlite3 $DATABASE "CREATE TABLE files (hash TEXT UNIQUE)" + mkdir -p $DIR + TMP=0 + for i in *; do + if [ -f "$i" ]; then + HASH=$(md5sum "$i" | awk '{ print $1 }') + sqlite3 $DATABASE "INSERT INTO files VALUES ('$HASH')" 2>/dev/null + if [ ! $? -eq 0 ]; then + mv -v "$i" "$DIR" + ((COUNT ++)) + ((TMP ++)) + fi + fi + done + + if [ $TMP -eq 0 ]; then + rmdir $DIR + fi + + if [ $LOOP = true ]; then + sqlite3 $DATABASE "DROP TABLE files" + echo "" + else + break + fi + + if [ $# -eq 0 ]; then + break; + fi +done + +echo "Found and moved $COUNT files to $DIR." +rm -f $DATABASE |
