Подтвердить что ты не робот

Shell-scripting: использовать канал в качестве входного сигнала для tar

Я пытаюсь выяснить способ использования tar + -трубок на сервере Ubuntu 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? Или я просто получил что-то не так?

4b9b3361

Ответ 1

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

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

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

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

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

Обратите внимание, что "gzip" не является "zip". Утилита "gzip" просто сжимается; он не архивирует.

Ответ 2

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

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


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

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

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

Архив → Сжатие → Шифрование

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

Расшифровать → Uncompress → Извлечь

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

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

Ответ 3

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

Ответ 4

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

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