Я пытаюсь сжать папку, чтобы передать ее по 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
архив.