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