Duplikatu paieska ir perkelimas

Iš Žinynas.
10:29, 22 spalio 2019 versija, sukurta \dev\null (Aptarimas | indėlis) (Naujas puslapis: Failų duplikatų radimas ir perkėlimas pagal jų sha1 file checksum. = Naudojimas = ./find_dups /Volumes/Data/A /Volumes/Data/A/original /Volumes/Data/A/duplicates * /Volume...)
(skirt) ← Ankstesnė versija | Dabartinė versija (skirt) | Vėlesnė versija → (skirt)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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

Naudojimas

./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

#!/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