Primeiro, criaria os subdiretórios em new_dir
por
cd main_dir
for i in *; do mkdir "../new_dir/$i"; done
cd ..
Em seguida, você pode usar o comando bash
' for
novamente com a expansão de padrões para fazer exatamente o que precisa rapidamente:
for i in main_dir/*/*_ext.dat; do cp "$i" "new_dir${i##main_dir}"; done
usando o fato de que os diretórios de destino existem. Por fim, se não tiver certeza de que cada deles seria realmente usado, você poderá remover os vazios depois:
cd new_dir
rmdir --ignore-fail-on-non-empty *