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