LINUX.ORG.RU

Не получается разбить tar архив на лету, при использовании большого количества опций

 ,


0

1

Смысл вот в чем: есть довольно старый скрипт, который делает архив, собирая кучу всего, после чего передает этот архив на удаленный FTP. Все счастливы, все хорошо. Но наступило время, когда вес архива перевалил за 2Gb и по кучи причин заливаться он перестал. Встала задача разбить его на части, но - split работать нормально не хочет.

Проблема в том, что на выходе должны быть файлы:

archive.tar   -- первые 2Гб
archive.tar.0 -- следующие 2Гб
archive.tar.1 -- следующие 2Гб

Это важно для автоматики, на удаленной машине. split нарезает файл, называя первый *.0, поэтому выход - резать на лету и тут начинаются проблемы.

Команда на архивацию:

tar -cf /var/www/html/backup/20201211_155559-files.tar -C /var/www/html/files_exchange --exclude=cache --exclude=core/backup --exclude=stack_cache --exclude=tmp . | split -d -a 1 -b 2G

которая, собственно, ничего не нарезает - создается один большой файл. Единственное, как получается - если убрать exclude, убрать ключ -C, убрать точку в конце и заменить -cf на просто cf, тогда да, но архивируется весь мусор, в архив включаются абсолютные пути, создается он не там, одним словом всё не то)

Ну и вопрос - split вообще способен нарезать архив на лету, в случае использования большого количества параметров у tar? Или я просто где-то накосячил в синтаксисе? Очень надеюсь на помощь гуру)

ЗЫ: смотрел про параметр -M у tar, но он ждет от пользователя действий и работает немного не так, как надо. И самое обидное - нельзя юзать другие утилиты, типа 7zip, потому что решение распространяемое, и не везде есть возможность доставить пакеты, если их нет.



Последнее исправление: Oskaria (всего исправлений: 1)

Флаг -f у tar отвечает за запись файла, его придётся убрать. Получаем:

tar -c -C /var/www/html/files_exchange --exclude=cache --exclude=core/backup --exclude=stack_cache --exclude=tmp .

Архив записывается на стандартный вывод, пол дела сделано. Теперь вторая половина, split. Тому нужно передавать имена файлов, иначе он читает стандартный ввод (что нам и нужно), но создаёт файлы, начинающиеся на x, что нам не нужно. Исправляем:

split -d -a 1 -b 2G - /var/www/html/backup/20201211_155559-files.tar.

Теперь split и читает стандартный ввод, и кладёт файлы на место. Команды нужно соединить при помощи символа pipe (|).

split не умеет создавать файлы без суффикса, поэтому придётся делать пакетное переименование. В 2 этапа, чтобы ничего не перезаписать:

# дописываем _ к концу имён файлов, предотвращая конфликты
prename 's/(\d+)$/$1_/' /var/www/html/backup/20201211_155559-files.tar.*
# уменьшаем число на 1, а у нулевого файла убираем суффикс
prename 's/\.(\d+)_$/$1 == 0 ? "" : ".".($1-1)/e' /var/www/html/backup/20201211_155559-files.tar.*_

Это делается уже без pipe, после того, как split закончит работу.

(Не забудьте доставить perl-rename или как он называется в вашем дистрибутиве)

anonymous
()
Ответ на: комментарий от anonymous

Да это же решило все проблемы xD Спасибо! Единственное что - я сделал чуть иначе - получилось переименовать файлы при передаче по ftp, но главная проблема решена - файл режется, всё отрабатывает как надо! Спасибо!)

Oskaria
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.