Можно ли сделать файл .tar.gz непосредственно из stdin? Или, мне нужно, чтобы смонтировать вместе уже gzipped файлы

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

mysqldump ... | gzip -c > mysql-backup.gz 

Это нормально, но я готов сделать отдельный файл для каждой отдельной базы данных, поскольку это упростит просмотр данных сбрасываемых данных или восстановление единой базы данных:

  • Разделить файл gz и распаковать отдельно
  • Как я могу изменить первую строку большого файла gzip без распаковки всего этого?
  • Раскройте архив gz с расширением zip
  • Как восстановить поврежденный файл tar.gz
  • Как сообщить gzip о сохранении исходного файла?
  • деформировать, но сохранить -v подробный вывод отдельно от STDERR
  •  for db in $dbs; do mysqldump ... $db | gzip -c > mysql-backup-$db.gz; done 

    Я хотел бы сохранить все дампы для каждой отдельной резервной копии в одном файле .tar , т. mysql-backup.tar.gz со всеми сбрасываемыми базами данных внутри. Я знаю, что могу просто оставить файлы .sql несжатыми, а затем tar -cz *.sql , но 1) Я ищу способ, который не требует временного хранения больших файлов . В моем текущем сценарии, фактически, mysqldump передается в gzip , поэтому большой файл не создается.

    2) Есть ли аналогичный способ, с помощью которого я могу создать .tar.gz из stdin ?

    3) Является ли tar -c *.sql.gz эквивалентным для tar -cz *.sql ?

  • изменять права собственности на файлы в архиве tar
  • Самый быстрый и эффективный способ получить количество записей (строк) в gzip-сжатом файле
  • Самый быстрый способ найти, существует ли файл в нескольких tarballs?
  • Каталог Untar из большого tarball
  • Восстановление поврежденного tarball
  • Почему мой tar-файл больше, чем резервная копия каталога
  • 4 Solutions collect form web for “Можно ли сделать файл .tar.gz непосредственно из stdin? Или, мне нужно, чтобы смонтировать вместе уже gzipped файлы”

    Не легко. tar записывает не только содержимое файла, но и метаданные файлов (имя, временные метки, разрешения, владельца и т. д.). Эта информация должна произойти откуда-то, и ее не будет в трубе.

    Вы можете gzip дампы базы данных в файл (вероятно, названный для данной базы данных), добавьте файл в архив tar и затем удалите файл перед тем, как перейти к следующей базе данных. Это приведет к созданию файла .gz.tar, который необычен, но никоим образом не является проблемой и, вероятно, не будет использовать значительно больше диска, чем gzipping дампа всей базы данных (он будет немного менее эффективно сжиматься, поскольку он не может совместно использовать границы базы данных).

    Я собрал несколько питонов, чтобы делать то, что вы хотите. Он использует библиотеку tarfile python для добавления stdin в файл tar, а затем просто ищет обратно в tar для перезаписи заголовка с нужным размером в eof. Использование:

     rm -f mytar for db in $dbs do mysqldump ... $db | gzip -c | tarappend -t mytar -f mysql-backup-$db.gz done tar tvf mytar 

    Вот сценарий tarappend :

     #!/usr/bin/python # concat stdin to end of tar file, with given name. meuh on stackexchange # $Id: tarappend,v 1.3 2015/07/08 11:31:18 meuh $ import sys, os, tarfile, time, copy from optparse import OptionParser try: import grp, pwd except ImportError: grp = pwd = None usage = """%prog: ... | %prog -t tarfile -f filename Appends stdin to tarfile under the given arbitrary filename. tarfile is created if it does not exist.\ """ def doargs(): parser = OptionParser(usage=usage) parser.add_option("-f", "--filename", help="filename to use") parser.add_option("-t", "--tarfile", help="existing tar archive") (options, args) = parser.parse_args() if options.filename is None or options.tarfile is None: parser.error("need filename and tarfile") if len(args): parser.error("unknown args: "+" ".join(args)) return options def copygetlen(fsrc, fdst): """copy data from file-like object fsrc to file-like object fdst. return len""" totlen = 0 while 1: buf = fsrc.read(16*1024) if not buf: return totlen fdst.write(buf) totlen += len(buf) class TarFileStdin(tarfile.TarFile): def addstdin(self, tarinfo, fileobj): """Add stdin to archive. based on addfile() """ self._check("aw") tarinfo = copy.copy(tarinfo) buf = tarinfo.tobuf(self.format, self.encoding, self.errors) bufoffset = self.offset self.fileobj.write(buf) self.offset += len(buf) tarinfo.size = copygetlen(fileobj, self.fileobj) blocks, remainder = divmod(tarinfo.size, tarfile.BLOCKSIZE) if remainder > 0: self.fileobj.write(tarfile.NUL * (tarfile.BLOCKSIZE - remainder)) blocks += 1 self.offset += blocks * tarfile.BLOCKSIZE # rewrite header with correct size buf = tarinfo.tobuf(self.format, self.encoding, self.errors) self.fileobj.seek(bufoffset) self.fileobj.write(buf) self.fileobj.seek(self.offset) self.members.append(tarinfo) class TarInfoStdin(tarfile.TarInfo): def __init__(self, name): if len(name)>100: raise ValueError(name+": filename too long") if name.endswith("/"): raise ValueError(name+": is a directory name") tarfile.TarInfo.__init__(self, name) self.size = 99 self.uid = os.getuid() self.gid = os.getgid() self.mtime = time.time() if pwd: self.uname = pwd.getpwuid(self.uid)[0] self.gname = grp.getgrgid(self.gid)[0] def run(tarfilename, newfilename): tar = TarFileStdin.open(tarfilename, 'a') tarinfo = TarInfoStdin(newfilename) tar.addstdin(tarinfo, sys.stdin) tar.close() if __name__ == '__main__': options = doargs() run(options.tarfile, options.filename) 

    Нет, и я так часто пропускаю эту функцию: мой вопрос о Ask Ubuntu .

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

    Я думаю, что что-то можно сделать в Perl, в котором есть библиотека, предназначенная для сжатия / декомпрессии / архивирования файлов: посмотрите, можете ли вы извлечь максимальную пользу из этого ответа: связанный ответ на Ask Ubuntu .

    Вы могли бы подумать о том, чтобы использовать пост-процессор с опозданием .

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

    Обратите внимание, что mysqldump понимает параметр --export-all (см. Это ). Вы можете передать это в некоторый скрипт, понимая границы и т. Д. …

    Linux и Unix - лучшая ОС в мире.