The most efficient, but possibly the least legible, approach is to just enumerate everything in one big happy mv
command.
mv Z_*ana_bwk_na_N*.png \
Z_*ana_bwk_dwda*.png \
Z_*ana_bwkman_dwdna* \
Z_*ana_bwkman_dwdc* \
Z_*EDZW*_nwv01*_p00_na_N*WV11.png \
Z_*EDZW*_nwv01*_p00_nh_N*WV11.png \
Z_*nwv01*_hsy_NA*.png \
Z_*EDZW_*_htp_na_N_*_WV11SW.png \
Z_*_rft_na_*.png \
Z_*_r12* \
destination
If you want to split this up (perhaps because you get "command line too long") you can use a here document.
while read files; do
mv $files dest
done <<____
Z_*ana_bwk_na_N*.png
Z_*ana_bwk_dwda*.png
Z_*ana_bwkman_dwdna*
Z_*ana_bwkman_dwdc*
Z_*EDZW*_nwv01*_p00_na_N*WV11.png
Z_*EDZW*_nwv01*_p00_nh_N*WV11.png
Z_*nwv01*_hsy_NA*.png
Z_*EDZW_*_htp_na_N_*_WV11SW.png
Z_*_rft_na_*.png
Z_*_r12*
____
If you want to parametrize the destination, you can do that too.
while read destination files; do
mv $files "$destination"
done <<____
here Z_*ana_bwk_na_N*.png
here Z_*ana_bwk_dwda*.png
here Z_*ana_bwkman_dwdna*
there Z_*ana_bwkman_dwdc*
there Z_*EDZW*_nwv01*_p00_na_N*WV11.png
everywhere Z_*EDZW*_nwv01*_p00_nh_N*WV11.png
here Z_*nwv01*_hsy_NA*.png
elsewhere Z_*EDZW_*_htp_na_N_*_WV11SW.png
there Z_*_rft_na_*.png
anywhere Z_*_r12*
____
Somewhat confusingly, the wildcards in the here document will be expanded by the shell before the loop runs. Because we need the inner loop to be unquoted, the expanded file names cannot contain any shell metacharacters (which do not match exactly only themselves -- typically irregular whitespace or wildcard expressions).
mv
with all those wildcards as its argument and the destination directory as its final argument. But it's not clear if that is actually what you want. Do all the matches go to the same destination?