сценарии оболочки: использование канала в качестве входных данных для tar - PullRequest
13 голосов
/ 04 марта 2010

Я пытаюсь найти способ использовать tar + pipe на Ubuntu Server LTS.

У меня есть команда postgresql (pg_dump), которая выводит много sql на стандартный вывод:

pg_dump -U myUser myDB

Я знаю, как перенаправить это в файл:

pg_dump -U myUser myDB > myDB.sql

Чтобы сэкономить место на диске, я бы предпочел сжать его: я могу сделать файл tar.gz из этого myDB.sql и затем удалить myDB.sql.

Но мне было интересно - есть ли способ сделать это без создания промежуточного файла .sql? Я полагаю, что это может быть достигнуто с помощью трубок ... однако я не гуру-снаряд и очень мало знаю о них (я могу сделать ls | more, вот и все). Я пробовал несколько вариантов pg_dump .. | tar ..., но безуспешно.

Как я могу использовать канал, чтобы использовать вывод pg_dump в качестве ввода для tar? Или я что-то не так понял?

Ответы [ 4 ]

31 голосов
/ 04 марта 2010

Я не вижу, как "смола" фигурирует в этом вообще;почему бы просто не сжать сам файл дампа?

pg_dump -U myUser myDB | gzip > myDB.sql.gz

Затем, чтобы восстановить:

gzip -cd myDB.sql.gz | pg_restore ...

Утилита "tar" предназначена для объединения нескольких файлов и каталогов в одинфайл (название является сокращением от «архива ленты»).В этом отношении файл tar похож на файл zip, за исключением того, что zip всегда подразумевает сжатие, а tar - нет.

Обратите внимание, наконец, что «gzip» нет »застежка-молния «.Утилита "gzip" just сжимает;это не делает архивы.

7 голосов
/ 15 июля 2012

В вашем случае использования pg_dump создает только один файл, который необходимо сжать. Как уже отмечали другие, в * nix land архив - это отдельный файл, представляющий файловую систему. В соответствии с идеологией Unix один инструмент на задачу , сжатие является отдельной задачей от архивирования. Поскольку архив - это файл, он может быть сжат, как и любой другой файл. Поэтому, поскольку вам нужно сжать только один файл, tar не нужен, поскольку другие уже правильно указали.

Однако ваш заголовок и теги приведут сюда будущих читателей, которые могут ожидать следующего ...


Допустим, у вас есть целая папка, полная резервных копий PostgreSQL для архивирования и сжатия. Это все еще должно быть сделано целиком с использованием tar, поскольку его -z или --gzip flag вызывает инструмент gzip .

Итак, давайте также скажем, что вам необходимо зашифровать архивы базы данных, чтобы подготовить их к перемещению в сомнительно защищенное решение для резервного копирования за пределы площадки (такое как S3-совместимое хранилище объектов). Предположим, вам нравится шифрование с предварительным общим токеном (паролем) с использованием шифра AES.

Это может быть допустимая ситуация, когда вам может потребоваться передать данные в tar и из tar.

Архив -> Сжать -> Зашифровать

tar cz folder_to_encrypt | openssl enc -aes-256-cbc -e > out.tar.gz.enc

Расшифровать -> Распаковать -> Извлечь

openssl enc -aes-256-cbc -in ./out.tar.gz.enc -d | tar xz --null

Обратитесь к документации GNU tar для подробностей о том, как флаг --null работает, и других полезных примеров для других ситуаций, когда вам может понадобиться передать файлы в tar. 1030 *

2 голосов
/ 04 марта 2010

Tar принимает имена файлов в качестве входных данных. Вы, вероятно, просто хотите сжать вывод pg_dump следующим образом:

pg_dump -U myUser myDB |gzip > myDB.sql.gz
2 голосов
/ 04 марта 2010

tar не сжимает, вам нужно gzip или инструмент сжатия similat

...