Esse script faz a suposição de que há uma lacuna significativa nos tamanhos entre os grupos de arquivos menores e maiores. Em particular, o menor dos arquivos grandes é pelo menos duas vezes maior que o maior dos arquivos pequenos.
Chame o script "imagedirstats" e execute-o em um loop como este:
find /path/to/main/branch -type d | while read subdir; do (cd "$subdir" && ~/bin/imagedirstats ); done
para encontrar e excluir arquivos em diretórios individuais na árvore de diretórios.
Aqui está o script:
#!/bin/bash
# from http://superuser.com/questions/135951/batch-deletion-of-smaller-files-from-group-of-files-via-unix-command-line
# by Dennis Williamson - 2010-04-29
prevn=1 # prevent division by zero
factor=4 # how close to the largest of the small files to set the threshold, 4 == one fourth of the way above
min=1000 # ignore files below this size
while read n
do
(( ratio = n / prevn ))
if (( ratio > 1 && n > min ))
then
break
fi
if (( n > 0 ))
then
prevn=$n
fi
done < <(find . -maxdepth 1 -name "*.jpg" -printf "%s\n" | sort -n)
# for OS X, comment out the preceding line and uncomment this one:
# done < <(find . -maxdepth 1 -name "*.jpg" | stat -f "%z" | sort -n)
# the following line would be the GNU equivalent using stat(1) instead of printf
# it's included here for reference:
# done < <(find . -maxdepth 1 -name "*.jpg" | stat -c "%s" | sort -n)
(( size = (n - prevn) / factor + prevn ))
echo "Smallest of the large: $n"
echo "Largest of the small: $prevn"
echo "Ratio: $ratio"
echo "Threshold: $size"
if (( ratio < 2 ))
then
read -p "Warning: ratio too small. Delete anyway? Only 'Yes' will proceed" reply
if [[ $reply != "Yes" ]]
then
echo "Cancelled" >&2
exit 1
fi
fi
# uncomment the delete on the following line to actually do the deletion
find . -maxdepth 1 -name "*.jpg" -size -${size}c # -delete
Editar: Movido o aviso para que informações úteis sejam exibidas primeiro. Corrigido um fi
ausente.
Editar 2: Tornou os dois comandos find
consistentes. Adicionada uma variação comentada do OS X. Adicionadas informações sobre a execução do script.