Если вся странность в Ваших именах каталогов - то, что у них есть пробелы, это должно сделать:
shopt -s nullglob
for dir in */;do
dir="${dir%/}"
zip "$dir".zip "$dir"/*.{shp,shx,qpj,prj,dbf}
done
Ну, не уверенный, если с одним лайнером возможно, вероятно, да. Но я сделал то, в чем Вы нуждаетесь вместо этого с этим:
OIFS=$IFS
IFS='\n'
find . -type d -maxdepth 1 | while read -r i; do
find $i -name "*.shp" -o -name "*.shx" -o -name "*.shx" -o -name "*.prj" -o -name "*.qpj" |zip -@ "$i".zip
done
IFS=$OIFS
Каждый zip-файл будет Вашим именем dir.