bash 4.x
#!/bin/bash
declare -A arr
shopt -s globstar
for file in **; do
[[ -f "$file" ]] || continue
read cksm _ < <(md5sum "$file")
if ((arr[$cksm]++)); then
echo "rm $file"
fi
done
Isso é tanto recursivo quanto manipula qualquer nome de arquivo. A desvantagem é que ele requer a versão 4.x para a capacidade de usar matrizes associativas e pesquisa recursiva. Remova o echo
se você gostar dos resultados.
versão do gawk
gawk '
{
cmd="md5sum " q FILENAME q
cmd | getline cksm
close(cmd)
sub(/ .*$/,"",cksm)
if(a[cksm]++){
cmd="echo rm " q FILENAME q
system(cmd)
close(cmd)
}
nextfile
}' q='"' *
Observe que isso ainda será interrompido nos arquivos que possuem aspas duplas em seus nomes. Nenhuma maneira real de contornar isso com awk
. Remova o echo
se você gostar dos resultados.