Maybe try this. To avoid moving files just moved to all/txt, move them to a new txt directory outside of all, then move txt under all. Here we go:
$ mkdir txt
The next one will only print all move commands. Check that you like what you see:
$ find all | sed -rn 's#^all/recup_dir.([^/]*)/([^/]*).txt$#mv -n "&" "txt/\1-\2.txt"#p' mv -n "all/recup_dir.20/2.txt" "txt/20-2.txt" mv -n "all/recup_dir.20/1.txt" "txt/20-1.txt" mv -n "all/recup_dir.19/5.txt" "txt/19-5.txt" mv -n "all/recup_dir.19/4.txt" "txt/19-4.txt" ...
When satisfied, run them by appending | sh:
$ find all | sed -rn 's#^all/recup_dir.([^/]*)/([^/]*).txt$#mv -n "&" "txt/\1-\2.txt"#p' | sh
then put txt where it belongs:
$ mv txt all
1.txt) will overwrite each other. How do you want to resolve this conflict?