Могу ли я сжать всю папку, используя gzip?


407

Я пытаюсь заархивировать папку в Unix. Это можно сделать с помощью команды gzip?


6
Вы можете использовать gzip -r myfolderкоторый будет рекурсивно gzip файлы. Таким же образом вы можете разархивировать файлы, используя gunzip -r myfolder которые будут разархивировать файлы рекурсивно. Для получения дополнительной информации, man gzip
Валентин Байрами

12
Использование tar; он поддерживает параметры для сжатия. gzipразработан как дополнение tar, а не как замена.
Devnull

13
Обратите внимание, что предложение @ val0x00ff почти наверняка не то, чего вы хотите достичь.
Шадур

4
@Shadur, поэтому я опубликовал это, так commentкак это не было ответом на его вопрос.
Валентин Байрами

2
Чтобы продемонстрировать, что означает @Shadur. Данные файлы 1и 2в папке playground. gzip -r ./playgroundдаст вам 1.gzи 2.gz(и не более 1и 2файлы) в папке playground, а не ZIP-файл со всем в нем.
Джефф Сяо

Ответы:


660

Нет.

В отличие zip, gzipфункционирует в качестве алгоритма сжатия только .

Из - за различных причин , некоторые из которых слушать обратно в эпоху ленточных накопителей, Unix использует программу под названием tarархивировать данные, которые затем могут быть сжат с помощью программы сжатия , как gzip, bzip2, 7zipи т.д.

Чтобы «сжать» каталог, правильная команда будет

tar -zcvf archive.tar.gz directory/ 

Это будет сказать , tarчтобы

  • сжать его с помощью алгоритма z (gzip)

  • c (создать) архив из файлов в directory( tarпо умолчанию является рекурсивным)

  • v (многословно) список (в / dev / stderr, чтобы он не влиял на переданные по конвейеру команды) всех файлов, которые он добавляет в архив.

  • и сохранить вывод как f (файл) с именемarchive.tar.gz

Команда tarпредлагает gzipподдержку (через -zфлаг) исключительно для вашего удобства. Команда gzip/ lib полностью отделена. Команда выше фактически такая же, как

tar -cv directory | gzip > archive.tar.gz

Для распаковки и распаковки архива в текущий каталог вы бы использовали

tar -zxvf archive.tar.gz

Эта команда фактически такая же, как

gunzip < archive.tar.gz | tar -xv

tarимеет много, много, много других вариантов и применений; Я от всей души рекомендую прочитать его man-страницу когда-нибудь.


51
Просто чтобы сделать вещи еще более явными, это в точности соответствует tar -cv directory | gzip > archive.tar.gz. Полученный архив может быть затем извлечен tar -zxvfили даже zcat file.tar.gz | tar -xv. Дело в том, что tar полностью независим от gzip, tarкоманда просто включает поддержку gzip для удобства.
Патрик

Я использую в tar cvzfтечение достаточно долгого времени. Следует отметить одну вещь: если вы используете Windows ( 7-zipчтобы указать), чтобы распаковать *.tar.gzфайл, это займет два раунда. Один - распаковать *.tar.gzфайл в *.tarфайл, второй - распаковать этот tar-файл в исходное содержимое. это увеличивает общее время распаковки, особенно для больших файлов (например, журналов)
Джефф Сяо

1
Влияет ли наименование архива на машины? Я знаю, что было бы неплохо, чтобы люди знали алгоритм, изначально использовавшийся для его архивирования (отсюда .gz), но кроме этого имеет ли значение, как вы называете архив?
hello_there_andy

3
@hello_there_andy Это не имеет значения для большинства юниксов, но Windows (и завершение Smart Tab в Linux) делает предположения на основе расширения имени файла.
Шадур

1
@vadimkotov Это может быть то, что вы ищете: superuser.com/questions/168749/…
Шадур

47

Команда gzipне будет рекурсивно сжимать каталог в один zip-файл при использовании -rпереключателя. Скорее, он будет обходить эту структуру каталогов и упаковывать каждый найденный файл в отдельный файл.

пример

до

$ tree dir1/
dir1/
|-- dir11
|   |-- file11
|   |-- file12
|   `-- file13
|-- file1
|-- file2
`-- file3

Теперь запустите gzipкоманду

$ gzip -r dir1

после

$ tree dir1/
dir1/
|-- dir11
|   |-- file11.gz
|   |-- file12.gz
|   `-- file13.gz
|-- file1.gz
|-- file2.gz
`-- file3.gz

Если вы предпочитаете tarсжать структуру каталогов, то, вероятно, захотите использовать команду, а затем сжать полученный .tarфайл.

$ tar zcvf dir1.tar.gz dir1/

пример

$ tar zcvf dir1.tar.gz dir1/
dir1/
dir1/file1
dir1/file2
dir1/dir11/
dir1/dir11/file11.gz
dir1/dir11/file12.gz
dir1/dir11/file13.gz
dir1/file3

В результате получается следующий файл:

$ ls -l | grep tar
-rw-rw-r-- 1 saml saml  271 Oct  1 08:07 dir1.tar.gz

Вы можете подтвердить его содержание:

$ tar ztvf dir1.tar.gz 
drwxrwxr-x saml/saml         0 2013-10-01 08:05 dir1/
-rw-rw-r-- saml/saml         0 2013-10-01 07:45 dir1/file1
-rw-rw-r-- saml/saml         0 2013-10-01 07:45 dir1/file2
drwxrwxr-x saml/saml         0 2013-10-01 08:04 dir1/dir11/
-rw-rw-r-- saml/saml        27 2013-10-01 07:45 dir1/dir11/file11.gz
-rw-rw-r-- saml/saml        27 2013-10-01 07:45 dir1/dir11/file12.gz
-rw-rw-r-- saml/saml        27 2013-10-01 07:45 dir1/dir11/file13.gz
-rw-rw-r-- saml/saml         0 2013-10-01 07:45 dir1/file3

4

Я написал эти 2 команды:

gzipdir:

#!/bin/bash
if [[ -d $1 ]]; then
    cd "$1"
    cd ..
    base=$(basename "$1")
    tar -zcvf "$base.tgz" "$base"
    if [[ $? == 0 && -f "$base.tgz" ]]; then
        rm -rf "$base"
    fi
else
    echo "Usage: $0 DIRECTORY";
fi

ungzipdir:

#!/bin/bash
if [[ -f $1 ]]; then
    base=${1%%.*}
    file=$(basename "$1");
    dir=$(basename "$base");
    if [[ ! -d $base ]]; then
        mkdir "$base"
        cd "$base"
        cd ..
        tar -xvf "$file"
        if [[ $? == 0 && -d "$dir" ]]; then
            rm -f "$file"
        fi
    else
        echo "Directory $base already exists. Nothing done."
    fi
else
    echo "Usage: $0 file.tgz";
fi

(!!!) Пожалуйста, проверьте перед использованием (так как есть 'rm -f', который потенциально может удалить важные данные, если используется необычным образом).

Как пользоваться:

cd /home/; gzipdir MyDirectory или же gzipdir /home/MyDirectory

Создаст /home/MyDirectory.tgz и удалит MyDirectory в случае успеха (!!!).

ungzipdir /home/MyDirectory.tgz

Создаст / home / MyDirectory и удалит /home/MyDirectory.tgz в случае успеха.


Чтобы заархивировать ВСЕ файлы в каталоге: find ./* -maxdepth 0 -type d -exec gzipdir {} \; (будьте осторожны с командой find, -exec echo {}сначала проверьте ее , и убедитесь, что вы не захватываете «./», который заархивирует каталог PARENT, возможно, нарушая весь ваш домашний каталог)
Андрей Лориен

1

Я рекомендую использовать pigz( параллельная реализация GZip )

tar -cvf - dir | pigz -9 > /path/to/dir.tar.gz


Я тоже часто его использую (и pixz), но работает ли он, когда в игру вступают каналы и перенаправление вывода?
Майкл Вольф

1

Ответ на вопрос «Могу ли я заархивировать всю папку, используя zip на linux?», Должен использовать синтаксис:

zip -r <zip file name> <folder to zip>

Если у вас есть новый вопрос, задайте его, нажав кнопку « Задать вопрос» . Включите ссылку на этот вопрос, если это помогает обеспечить контекст. - Из обзора
Джефф Шаллер

2
@JeffSchaller: это ответ. Это очень неправильно (я считаю), но это, безусловно, ответ.
Скотт

1
@ize: Я уверен, что команда, которую вы разместили, на самом деле не использует gzip.
Даг

1
Очки за использование zip, как заданный вопрос, скорее всего, автору хотелось бы знать, что можно сделать ТОЧНО ТО ЖЕ ВСЕ, как он это делал на окнах. Печально, что большинство людей не хотят думать так далеко.
Флориан Хейгл

2
Сложно, когда в вопросе указывается ... «используя gzip».
Джефф Шаллер

1

Для полноты, если вы хотите сохранить файл в фоновом режиме, используйте ответ @ Shadur и добавьте &в конце:

tar -zcvf archive.tar.gz directory/ &

0

Если ваш linux tar не поддерживает эту -zопцию, вы можете использовать следующее:

tar -cvf - dir | gzip > dir.tar.gz
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.