ux386
(usa Debian)
Enviado em 21/11/2008 - 21:16h
Por acaso eu tenho um script que faz isso... Ele tira o md5sum de todos os arquivos, ordena a lista, 'diffa' os arquivos com o mesmo md5 (só pra ter certeza) e, se forem iguais, apaga o último (ou mostra o que ele apagaria, caso a opção '-n' seja usada). Como ele compara arquivo por arquivo, ele pode ser *MUITO* lento, mas ele faz o serviço.
Com o '-n' ele imprime uma lista na forma:
rm -v "arquivo-tal" #same as arquivo-tal
Assim você pode redirecionar a saída para um arquivo, escolher o que você quer realmente apagar, e rodar o arquivo (bash arquivo).
Para todos os fins, este código está em domínio público. ;-)
(E fica bem melhor com tabulação...)
#!/bin/bash
# cnr - Compare and Remove.
# 2008/08/02.
IFS=''
[[ $# -eq 0 ]] && {
echo "Usage: ${0##*/} [-n] dir..."
echo " -n: No action - just shows what would be done."
exit 1
}
while [[ $# -gt 0 ]]; do
case "$1" in
-n) noact=1 ;;
--) break ;;
-*) echo "Unknown option \"$1\"."; exit 1 ;;
*) break ;;
esac
shift
done
if (($noact)); then
# del original new (removes $2).
del() { printf 'rm -v %q #same as %q\n' "$2" "$1"; }
else
del() { rm -v "$2"; }
fi
find "$@" -type f -print0 | xargs -0 md5sum | LC_ALL=C sort | while read line; do
md5="${line%% *}"
file="${line#* }"
[[ $md5 = $lastmd5 ]] && cmp "$file" "$lastfile" && del "$lastfile" "$file"
lastmd5="$md5"
lastfile="$file"
done