Duplikatu paieska ir perkelimas

Iš Žinynas.
Jump to navigation Jump to search

Failų duplikatų radimas ir perkėlimas pagal jų sha1 file checksum.

Naudojimas[keisti]

./find_dups /Volumes/Data/A /Volumes/Data/A/original /Volumes/Data/A/duplicates
  • /Volumes/Data/A Pirmas parametras nurodo kur yra visi failai
  • /Volumes/Data/A/original Antras parametras kurios direktorijos neliesti viduje (pirmam parametre nurodytoje direktorijoje)
  • /Volumes/Data/A/duplicates Trečias parametras nurodo kur sudėti duplikatus (jeigu pavadinimai vienodi, bus surašyti ant viršaus)

Script[keisti]

#!/bin/bash
files_dir=$1
except_dir=$2
move_dir=$3

bannr() {
echo "Scripto paleidimo pavyzdys:"
echo "./find_dups /Volumes/Data/A /Volumes/Data/A/original /Volumes/Data/A/duplicates"
echo "nurodytu direktoriju pabaigose neturi buti / (slashu)"
}


if [[ -z "$files_dir" ]]; then
    echo "klaida: nenurodyta failu direktorija"
    bannr
    exit;
fi

if [[ -z "$except_dir" ]]; then
   echo "klaida: nenurodyta kurios direktorijos neliesti"
   bannr
   exit;
fi

if [[ -z "$move_dir" ]]; then
   echo "klaida: nenurodyta i kuria direktorija duplikatus perkelti"
   exit;
fi

if [ ! -d "$move_dir" ]; then
mkdir $move_dir
fi

find $files_dir -type f -exec openssl sha1 \{\} \; > /tmp/list.txt

count=-1
total=0
for l in `cat /tmp/list.txt | sed 's/SHA1(\(.*\))\= \(.*\)$/\2 \1/' | awk '{print $1}' | sort | uniq -c | sort -nr`
do
    if [[ $count == -1 ]]
    then
        count=$l
    else 
        hash=$l
        if [[ $count == 1 ]]
        then
            break
        fi
        for f in `grep $hash /tmp/list.txt | sed 's/SHA1(\(.*\))\= \(.*\)$/\2 \1/' | awk '{print $2}'`
        do
            if [[ $count > 1 ]]
            then
                if [[ $f == *"$except_dir"* ]]; then
                  echo "duplikatas $f randasi direktorijoje kuri nurodyta kaip nelieciama"
                else
                  echo "keliam: $f i $move_dir"
                  mv -f $f $move_dir/
                fi
                count=$((count-1))
            fi
        done
        total=`expr $total + $count`
        count=-1
    fi
done