Можно использовать распаковать
, например:
unzip -j file[.zip] [file] [-x xfile]
, где -j
означает мусорные пути, file[... zip]
- имя вашего архива, [файл]
- член архива, подлежащего обработке и [-x xfile]
- список членов архива, подлежащих исключению из обработки. Все эти опции подробно описаны в man-странице.
Таким образом, в вашем случае, запустив, например:
unzip -j ex1234.zip '*/*.csv' -x '*/*/*'
распаковывает в текущей директории все файлы, соответствующие *.csv
из уровня глубины 2 в архиве ex1234.zip
(исключая членов архива из уровня глубины 3 и ниже, так как '*/*/*'
означает пути, которые совпадают, как минимум, с двумя /
).
Теперь, чтобы обработать все архивы в текущей директории, можно запустить:
for zipfile in *.zip; do unzip -j "$zipfile" '*/*.csv' -x '*/*/*'; done
, который извлекает файл .csv
из каждого архива в текущей директории (для этого нужен -j
).
В вашем конкретном случае на глубине 1-го уровня нет .csv
, так что вы также можете запустить:
for zipfile in *.zip; do unzip -j "$zipfile" '*.csv' -x '*/*/*'; done
, что должно дать тот же результат.
Чтобы просмотреть, какие файлы будут извлечены (пути к архиву) без фактического извлечения, замените -j
на -qql
:
for zipfile in *.zip; do unzip -qql "$zipfile" '*/*.csv' -x '*/*/*'; done
В качестве примечания, опция -j
может быть опущена -iff на . csv
файлы для извлечения находились на уровне глубины 1 (т.е. без родительского dir); в этом случае вы могли просто запустить:
for zipfile in *.zip; do unzip "$zipfile" '*.csv' -x '*/*'; done