Назад | Перейти на главную страницу

GZIP не распаковывается как каталог

Я пытаюсь сжать папку, чтобы передать ее по FTP на свой веб-сервер.

Сжимаю на osx snow leopard и распаковываю на ubuntu 8.04

Это две команды, которые я выполняю

sudo git archive master | gzip > v-1.25.gz

sudo gunzip v1.25.gz 

Когда я распаковываю на своем локальном компьютере, он работает нормально, но на сервере вывод - это файл, а не каталог.

Что я делаю не так?

Если вы из мира Windows, вы привыкли использовать такие инструменты, как zip или rar, которые сжимают коллекции файлов. В типичной традиции Unix делать одно дело хорошо, а одно делать хорошо, у вас есть две разные утилиты; инструмент сжатия и формат архива. Затем люди используют эти два инструмента вместе, чтобы обеспечить ту же функциональность, что и zip или rar.

Существует множество различных форматов сжатия; в наши дни наиболее распространенными из них являются gzip (иногда известный как zlib) и более новый, более производительный bzip2. К сожалению, bzip2 использует больше ЦП и памяти, чтобы обеспечить более высокую степень сжатия. Вы можете использовать эти инструменты для сжатия любого файла, и по соглашению файлы, сжатые в любом из этих форматов, имеют формат .gz и .bz2. Вы можете использовать gzip и bzip2 для сжатия и gunzip и bunzip2 для распаковки этих форматов.

Также доступно несколько различных типов архивных форматов, включая cpio, ar и tar, но люди, как правило, используют только tar. Это позволяет вам взять несколько файлов и упаковать их в один файл. Они также могут включать информацию о пути и разрешениях. Вы можете создать и распаковать tar-файл с помощью команды tar. Вы могли слышать, как эти операции называются «tarring» и «unarring». (Название команды происходит от сокращения от Tape ARchive. Tar был улучшением формата ar в том смысле, что вы могли использовать его для охвата нескольких физических лент для резервного копирования).

  # tar -cf archive.tar list of files to include

Это создаст (-c) и заархивирует в файл -f с именем archive.tar. (.tar - это расширение по соглашению для архивов tar). Теперь у вас должен быть один файл, содержащий пять файлов («список», «из», «файлы», «в» и «включить»). Если вы укажете tar каталог, он будет рекурсивно перемещаться в этот каталог и хранить все внутри него.

  # tar -xf archive.tar
  # tar -xf archive.tar list of files

Это извлечет (-x) ранее созданный archive.tar. Вы можете извлечь из архива только те файлы, которые вам нужны, указав их в конце командной строки. В нашем примере вторая строка будет извлекать «список», «из», «файл», но не «в» и «включить». Вы также можете использовать

  # tar -tf archive.tar

чтобы получить список содержимого перед их извлечением.

Итак, теперь вы можете комбинировать эти два инструмента для воспроизведения функциональности zip:

  # tar -cf archive.tar directory
  # gzip archive.tar

Теперь у вас будет файл archive.tar.gz. Вы можете извлечь его, используя:

  # gunzip archive.tar.gz
  # tar -xf archive.tar

Мы можем использовать каналы, чтобы сэкономить промежуточный архив archive.tar:

  # tar -cf - directory | gzip > archive.tar.gz
  # gunzip < archive.tar.gz | tar -xf -

Вы можете использовать - с параметром -f, чтобы указать stdin или stdout (tar знает, какой из них, в зависимости от контекста).

Мы можем сделать немного лучше, потому что при небольшом очевидном нарушении идеи «одной работы хорошо» tar имеет возможность сжимать свой вывод и распаковывать ввод с помощью аргумента -z (я говорю очевидным, потому что он все еще использует Командная строка gzip и gunzip за кулисами)

 # tar -czf archive.tar.gz directory
 # tar -xzf archive.tar.gz

Чтобы использовать bzip2 вместо gzip, используйте bzip2, bunzip2 и -j вместо gzip, gunzip и -z соответственно (tar -cjf archive.tar.bz2). Некоторые версии tar могут обнаруживать файловый архив bzip2 с помощью -z и поступать правильно, но, вероятно, стоит выработать привычку быть явным.

Возвращаясь к вашей конкретной проблеме. git archive может создавать как tar-файл, так и zip-файл. По умолчанию он создает tar-файл.

 # git archive master | gzip > v-1.25.tar.gz

Это создаст сжатый tar-архив. Как мы видели выше, мы можем извлечь это, используя:

 # tar -xzf v-1.25.tar.gz

Вы также можете использовать:

 # git archive --format=zip master > v-1.25.zip
 # unzip v-1.25.zip

Больше информации:

g(un)zip обычно не поддерживает архивирование напрямую - просто сжатие одного файла. Чаще всего используется tar архиватор тогда gzip tar-файл. Я предполагаю, что gzip вариант, который вы используете для сжатия данных, замечает, что входные данные - это каталог, и автоматически добавляет дополнительный шаг (и делает то же самое при распаковке).

Пытаться tar -xvzf v1.25.gz или gunzip v1.25.gz | tar -xv
(удалить v из параметров tar, если вы не хотите подробного вывода, в котором перечислены файлы по мере их извлечения)
Или, если у вас уже есть распакованный файл, вы также можете попробовать tar -xvf v1.25 как файл должен, если я правильно угадаю, быть tar архив.