Duplikatu paieska ir perkelimas
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