Я пытаюсь заархивировать папку в unix. Можно ли это сделать с помощью команды gzip?
решение1
Нет.
В отличие от zip
, gzip
функционирует как алгоритм сжатиятолько.
По разным причинам, некоторые из которых восходят к эпохе ленточных накопителей, Unix использует программу с именем tar
для архивации данных, которые затем можно сжать с помощью программы сжатия, например gzip
, bzip2
, 7zip
, и т. д.
Чтобы «заархивировать» каталог, правильная команда будет такой:
tar -zcvf archive.tar.gz directory/
tar
Это расскажет
сожмите его с помощьюз(gzip) алгоритм
с(создать) архив из файлов в
directory
(tar
по умолчанию рекурсивен)в(подробно) вывести список (на /dev/stderr, чтобы не влиять на конвейерные команды) всех файлов, которые он добавляет в архив.
и сохранить вывод какф(файл) назван
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
имеет также много, много, МНОГО других опций и применений; я настоятельно рекомендую вам как-нибудь прочитать его страницу руководства.
решение2
Команда 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
решение3
Ответ на вопрос «Могу ли я сжать целую папку с помощью gzip [в Linux]?» заключается в том, что вы можете использовать программу zip
вместо gzip, используя следующий синтаксис:
zip -r <zip file name> <folder to zip>
решение4
Я рекомендую использовать pigz
(Параллельная реализация GZip)
tar -cvf - dir | pigz -9 > /path/to/dir.tar.gz