использовать tar для извлечения и немедленного сжатия файлов из tarball

У меня есть сжатый tarball (например, foo.tar.gz ), из которого я хочу извлечь все файлы, но файлы в tarball не сжимаются. То есть, содержимое foo.tar.gz – это не сжатые txt файлы.

В моей файловой системе недостаточно места для непосредственного извлечения файлов, поэтому я хочу извлечь эти файлы и немедленно сжать их, когда они записаны на диск. Я не могу просто извлечь файлы, а затем gzip извлеченные файлы, потому что, как я уже сказал, места в файловой системе недостаточно. Я также хотел бы убедиться, что оригинальные имена файлов, включая их каталоги, точно сохраняются на диске. Поэтому, если один из файлов в tarball равен /a/b/c/foo.txt , в конце процесса я хотел бы иметь /a/b/c/foo.txt.gz

Как я могу это сделать?

Это не будет быстро, особенно для большого tarball с большим количеством файлов, но в bash вы можете это сделать:

 tar -tzf tarball.tgz | while IFS= read -r file; do tar --no-recursion -xzf tarball.tgz -- "$file" gzip -- "$file" done 

Первая команда tar извлекает имена файлов в tarball и передает эти имена в цикл while while read ... . Затем имя файла передается во вторую команду tar, которая извлекает только этот файл , который затем сжимается до того, как будет извлечен следующий файл. Флаг --no-recursion используется, поэтому попытка извлечь каталог не извлекает все файлы в этом каталоге, что обычно делает tar.

Вам все равно потребуется достаточно свободного места, чтобы хранить несколько больше, чем исходный размер сжатого tarball.