пример:
https://stackoverflow.com/questions/41789176/how-t...
Если кратко алгоритм:
1. выясняем размер размер zip файла
2. читаем несколько байт из zip файла по известному адресу для того чтобы выяснить расположение и размер листинга файлов в zip файле
3. читаем несколько байт из zip файла с листингом файлов
4. создаем свой пустой zip файл вставляя туда полученные байты по нужным адресам.
функциями работы с zip выдаем список файлов
P.S. скрипт писал не я, но пару лет назад тоже решал подобную задачу.
"Спасение" тут - это чтение части файла, которое позволяет S3 и знание формата zip
В комментариях к ответу на SO написано про ограничения в размере zip в 4Гб - я не сталкивался и задачу по обходу проблемы не решал.