Você pode usar unzip da seguinte forma:
unzip -j file[.zip] [file] [-x xfile]
onde -j significa caminhos de spam, file[.zip] é o nome do arquivo, [file] é o membro do arquivo a ser processado e [-x xfile] é a lista de membros do arquivo a serem excluídos do processamento. Todas essas opções são descritas em detalhes na página man.
Então, no seu caso, executando por exemplo:
unzip -j ex1234.zip '*/*.csv' -x '*/*/*'
extrairá no diretório atual todos os arquivos correspondentes *.csv do nível de profundidade 2 no ex1234.zip archive (excluindo membros do archive do nível de profundidade 3 e abaixo como '*/*/*' significa caminhos que correspondem a pelo menos dois / ) .
Agora, para processar todos os arquivos no diretório atual que você pode executar:
for zipfile in *.zip; do unzip -j "$zipfile" '*/*.csv' -x '*/*/*'; done
que extrai o arquivo .csv de cada arquivo no diretório atual (é por isso que -j é necessário).
No seu caso particular, não há .csv na profundidade do nível 1, então você também pode executar:
for zipfile in *.zip; do unzip -j "$zipfile" '*.csv' -x '*/*/*'; done
que deve produzir o mesmo resultado.
Para executar e ver quais arquivos serão extraídos (seus caminhos de arquivo) sem realmente extraí-los, substitua -j por -qql :
for zipfile in *.zip; do unzip -qql "$zipfile" '*/*.csv' -x '*/*/*'; done
Como uma nota lateral, a opção -j poderia ser omitida iff os arquivos .csv a serem extraídos estavam no nível de profundidade 1 (ou seja, nenhum diretório pai); Nesse caso, você poderia simplesmente executar:
for zipfile in *.zip; do unzip "$zipfile" '*.csv' -x '*/*'; done