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? Или я просто получил что-то не так?
Ответы
Ответ 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