#1 23.01.2015 05:28:45

GTAlex
Administrator
Зарегистрирован: 23.10.2014
Сообщений: 18
IP-адрес

Не работает скрипт резервного копирования для новых файлов

find . -type f -mtime -10 -print0 | xargs -0 tar -cjf archive.tar.bz2

Не пашет на рабочем проект (добавилось порядка 2к картинок) - архивирует штук 100 и всё тут
Отдельно find запускаю с выводом результатов в файл - всё находит
Походу какое то ограничение при передаче параметров из find в tar срабатывает ...
Весь день убил - не нашел решение :(

Такая конструкция вроде пашет (без xargs), но когда натравляю её на другую папку вообще тупо виснет
find . -type f -mtime -10 -print0 | zip archive.zip @


Подробнее тут

#2 23.01.2015 06:26:43

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

Не работает скрипт резервного копирования для новых файлов

GTAlex, а если временный файл?

#!/bin/bash

set -x

TMP=$(mktemp)
find -mtime -10 >$TMP
tar --create --files-from $TMP
rm --force $TMP


второй альтернативный вариант:

[console]tar --create --after-date '10 days ago'[/console]

ну и третий вариант

#!/bin/bash

ARCNAME="arcname.tar"
:>"$ARCNAME"

while read FILENAME; do
  tar --append --file "$ARCNAME" "$FILENAME"
done< <(find -mtime -10)

bzip2 "$ARCNAME"


варианты 1 и 3 не работают если в имени файла есть перенос строки.

#3 23.01.2015 06:31:25

GTAlex
Administrator
Зарегистрирован: 23.10.2014
Сообщений: 18
IP-адрес

Не работает скрипт резервного копирования для новых файлов

Спасибо, буду пробовать

#4 23.01.2015 06:33:44

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

Не работает скрипт резервного копирования для новых файлов

Quote by GTAlex
Походу какое то ограничение при передаче параметров из find в tar срабатывает ...
всё правильно: xargs режет список аргументов дозами по несколько сотен..тысяч имён файлов. Дальше у вас записано "tar --create" что значит "создать архив". Он и создаётся несколько раз. Вы наблюдаете только последний вариант.

Если вы хотите делать обязательно так, то вам следует использовать --append, которая не работает для сжатых файлов, потому вам следует ещё потом сжать, как в третьем варианте.

ВАЖНО: для бекапов не нужно так извращаться с одностроками, следует учесть все ошибки. А то возможно ситуация, что у вас ошибка в скрипте, а вы думаете "у меня есть бекап". конец немного предсказуем :'(

#5 23.01.2015 06:51:03

GTAlex
Administrator
Зарегистрирован: 23.10.2014
Сообщений: 18
IP-адрес

Не работает скрипт резервного копирования для новых файлов

второй вариант

tar: Option --after-date is not supported

Quote by drBatty
ВАЖНО: для бекапов не нужно так извращаться с одностроками, следует учесть все ошибки.

согласен на все 100


первый вариант пашет частично - mktemp не сработал
прописал временный файл явно - всё попёрло

ещё раз огромное спасибо!

третий логикой понял, но с синтаксисом пока не могу разобраться

а вообще я так понял можно в моём варианте create заменить на append и вуаля

#6 23.01.2015 10:06:12

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

Не работает скрипт резервного копирования для новых файлов

Quote by GTAlex
tar: Option --after-date is not supported
поставьте tar поновее. Это у вас что, CentOS5 что-ли?

Quote by GTAlex
первый вариант пашет частично - mktemp не сработал
что значит "не сработал?

Ну вот вам аналог
TMP="/tmp/tmp.$RANDOM"

(эта команда создаёт только имя, но НЕ файл, но это не важно)
Quote by GTAlex
но с синтаксисом пока не могу разобраться

спрашивайте, что именно непонятно?
Quote by GTAlex
а вообще я так понял можно в моём варианте create заменить на append и вуаля
в принципе да, но
1. неудобно обрабатывать ошибки, когда две команды СРАЗУ работают, как у вас в одностроке.
2. вам же нужно сжатый архив, а tar --append так не умеет.
3. это очень долго, открывать файл, потом туда добавлять… Хотя мой третий пример ещё дольше, т.к. у меня по одному добавляются.

Да, на практике посмотрите tar --update, это как append, только добавляются только новые файлы. Хороший вариант, но тоже работает лишь без сжатия.

Можно сделать как:
1. на сервере хранить бекап без сжатия, и добавлять туда новые файлы
2. потом сжимать архив bzip2 --keep, опция НЕ удаляет архив без сжатия
3. теперь сжатый архив можно отправить на другой сервер, и удалить с этого.

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

#7 23.01.2015 17:47:04

GTAlex
Administrator
Зарегистрирован: 23.10.2014
Сообщений: 18
IP-адрес

Не работает скрипт резервного копирования для новых файлов

Quote by drBatty
спрашивайте, что именно непонятно?

Док, снимаю шляпу!
За, поистине немалый, опыт общения в IT форумах - Вы один из немногих профессионалов, лаконично и без лишнего пафоса объясняете для Вас, вещи элементарные, для же меня - золотой опыт.

Quote by drBatty
(эта команда создаёт только имя, но НЕ файл, но это не важно

смысл кода я понял сразу, поэтому не стал углубляться в особенности реализаций в конкретных ОС-nix, конкретная задача - быстрая и эффективная реализация :)

Теперь к теме:
Я сразу не отписал - извиняюсь - я остановился на первом варианте с промежуточным файлом - более простой (и менее ошибочный из за своей простоты, в чём и более выгодный).
Плюс к этому проблему (как мне сразу показалось) создания темпового файла я обратил в плюс (это ведь лог-файл непосредственно файлов добавляемых в архив - изучение которого помогло исключить много лишнего и абсолютно ненужного мусора)

Ещё раз большое Спасибо!
(поставил на Ваш форум прямую ссылку со статьи блога - хоть не материальная, а всё таки благодарность :) )

#8 24.01.2015 05:24:56

drBatty
Administrator
Зарегистрирован: 20.02.2010
Сообщений: 17 053
IP-адрес

Не работает скрипт резервного копирования для новых файлов

Quote by GTAlex
конкретная задача - быстрая и эффективная реализация
за быстротой и эффективность в bash'е не нужно гоняться. Всё равно тормозить у вас будет tar скорее всего, со своим вводом/выводом.

ИМХО гнаться нужно за понятностью и читаемостью, что-бы через год открыть скрипт, и за минуту его допилить применительно к новым условиям задачи.

А если вам нужна скорость, то лучше будет заменить HDD на SSD (в данном случае).

Quote by GTAlex
Плюс к этому проблему (как мне сразу показалось) создания темпового файла я обратил в плюс (это ведь лог-файл непосредственно файлов добавляемых в архив - изучение которого помогло исключить много лишнего и абсолютно ненужного мусора)

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

PS: тут в тему будут nice и ionice
Эти команды снижают приоритет tar'а и find, что-бы они не мешали основной работе.

Board footer