Доступ к заархивированным файлам без их распаковки - PullRequest
0 голосов
/ 24 мая 2019

У меня есть zip-файл, содержащий файл tar.gz.Я хотел бы получить доступ к содержимому файла tar.gz, но не разархивировав его

Я мог бы перечислить файлы в zip-файле, но, конечно, при попытке распаковать один из этих файлов, bash говорит: «Не удается открыть:Нет такого файла или каталога ", поскольку файл не существует

for file in $archiveFiles;
        #do echo ${file: -4};
        do
          if [[ $file == README.* ]]; then
            echo "skipping readme, not relevant"
          elif [[ $file == *.tar.gz ]]; then
            echo "this is a tar.gz, must extract"
            tarArchiveFiles=`tar -tzf $file`
            for tarArchiveFile in $tarArchiveFiles;
                do echo $tarArchiveFile
                done;

          fi
    done;

Возможно ли извлечь его" на лету ", не сохраняя его временно.У меня сложилось впечатление, что это выполнимо в Python

Ответы [ 2 ]

2 голосов
/ 24 мая 2019

Вы не можете сделать это без разархивирования (очевидно), но я предполагаю, что вы имеете в виду, без разархивирования в файловую систему.

unzip имеет опции -c и -p, которые распаковываются в стандартный вывод. -c выводит имя файла. -p просто выгружает данные двоичного разархивированного файла в стандартный вывод.

Итак:

unzip -p zipfile.zip path/within/zip.tar.gz | tar zxf - 

Или, если вы хотите перечислить содержимое файла tarfile:

unzip -p zipfile.zip path/within/zip.tar.gz | tar ztf - 

Если вы не знаете путь к tar-файлу внутри zip-файла, вам нужно написать что-то более сложное, которое использует вывод unzip -c, распознает строки имени файла в выводе. В этом случае может быть лучше написать что-то на «правильном» языке. Python имеет очень гибкую библиотечную функцию ZipFile, и большинство основных языков имеют нечто подобное.

1 голос
/ 24 мая 2019

Вы можете передать отдельный элемент zip-файла на стандартный вывод с помощью опции -p

В вашем коде измените

tarArchiveFiles=`tar -tzf $file`

на

tarArchiveFiles=`unzip -p zipfile $file | tar -tzf -`

замените "zipfile" на имя zip-архива, из которого вы получили $archiveFiles из

...