Está falhando porque você está pesquisando no diretório atual e não no destino. Altere sua descoberta para:
find "$d" -type f -exec ls -al {} \; | sort -nr -k5 | head -n 1
No entanto, uma maneira mais segura seria:
#!/bin/bash
for d in */ ; do
file=$(find "$d" -type f -printf "%s\t%f\n" | sort -n | tail -n 1 | cut -f 2- )
echo "$file"
mv "$d${file}" .
done
Embora isso ainda seja interrompido se os nomes dos arquivos contiverem novas linhas, pelo menos ele funcionará com nomes de arquivos que contenham espaços.
Se os seus arquivos também puderem conter novas linhas, você poderá tentar isso:
#!/bin/bash
for d in */ ; do
max=0
file=""
for f in "$d"/*
do
## If this is a file and its size is greater than the max so far,
## save it as "$file" and uts size as "$max".
[[ -f "$f" ]] && [[ $(stat -c "%s" "$f") -gt $max ]] && max="$size" && file="$f"
done
## move the largest file. Use "mv -i" to be prompted before overwriting.
mv "$file" .
done