Простая команда резервного копирования

Мне нужна команда, которая справляется автоматически с именованием файлов в целях резервирования. Например, мне назвали файл test.txt, и иногда я вручную должен обновить тот файл, назвав сценарий удара, который "повторно вычисляет" test.txt.

Я обычно, прежде, чем назвать тот сценарий удара, я вручную делаю копию файла с форматом как:

cp test.txt test.txt.bk.x

где x количество последнего резервного копирования + 1.

Я хотел бы поместить команду в начале своего сценария удара как:

backup_cp -options_about_backup_filename_format test.txt

это справляется автоматически с именованием следующего файла резервной копии. Я не должен повиноваться текущему шаблону именования файла, это мог быть любой последовательный формат, например, как файлы журнала в /var/log где резервное копирование n. 1 всегда последнее резервное копирование, или как текущее, где резервные числа находятся в растущем порядке.

Это было бы потрясающим, если команда могла бы также стереть резервные копии oldests автоматически.

0
задан 26 October 2017 в 07:42

3 ответа

Смотрите на logrotate команда. Вы указываете с файлом конфигурации, как скопировать более старую версию. Затем Вы звонили бы:

logrotate -f config_file

Простой пример файла конфигурации был бы:

/path/to/text.txt {
  rotate 10
}

У Вас есть много других опций как: dateext, поствращайтесь, предварительно вращайтесь и т.д.

С dateext дата добавляется в конце имени файла, таким образом, Вы знаете, когда резервное копирование было создано. Сообщение/Пред вращается, может выполнить некоторые задачи прежде и после резервного копирования.

При использовании числа, это немного отличается, поскольку Вы привыкли к. 1 последний файл, и возраст растет с числом.

Не вставляйте файл конфигурации /etc/logrotate.d/, потому что logrotate выполняет автоматически файлы конфигурации из того каталога. Вы хотите выполнить его только, когда Вы хотите и предоставляете файл конфигурации к logrotate.

4
ответ дан 2 November 2019 в 01:11

Вы можете просто сгенерировать число, а затем продолжить его и записать в файл.

Например,

#!/bin/bash
IDFILE="/path/to/file/.id_number"
ID=`cat $IDFILE`

#New ID for the next one
echo $[ID + 1] > $IDFILE

Создайте файл .id_number с номером в качестве содержания, с которого вы хотите начать, и вы можете начать его использовать.

0
ответ дан 2 November 2019 в 01:11

Я создал bash-скрипт, который может справиться с подобной задачей.

Сценарий содержит

  • Сценарий создаст резервную копию файла target или каталог . Также он может обрабатывать несколько каталогов файлов и (или) . Имя нового файла (или нового каталога ) будет target.N, где N - порядковый номер резервной копии.

  • У скрипта есть две опции:

    • --backup-chain=<chain name> - эта опция добавит строку <chain name> к имени файла резервной копии, и нумерация этой цепочки будет быть независимым от других цепей.

    • --verbose-mode - эта опция добавит -v к списку cp опций команды.

  • Здесь представлено несколько примеров использования: https://paste.ubuntu.com/25847541/

Настройка

1. Создайте исполняемый файл сценария под названием sbcp ( простая резервная копия ), который находится в /usr/local/bin и доступен как команда оболочки:

sudo touch /usr/local/bin/sbcp
sudo chmod +x /usr/local/bin/sbcp
sudo nano /usr/local/bin/spcp

2. [ 1139] Содержание сценария sbcp:

#!/bin/bash

# simple backup copy - sbcp

# Compose the info message - ref: https://askubuntu.com/a/583445/566421
info_message() {
        printf "Please set target - one or more file or directory: \e[33msbcp 'file1' 'file2' 'dir1/file3' 'dir2'\e[0m\n"
        printf "Use the option \e[33m--backup-chain='chain name'\e[0m or \e[33m--backup-chain=chain_name\e[0m to create different backup chains.\n"
        printf "Use '\e[33msbcp *\e[0m' to make a backup copy for all items in the current directory, non recursively.\n"
}

# If the STDIN is not empty, then do the operations, else just output the info message
if [ ! -z "${@+x}" ]; then

        # Check whether there options are set - this should be more elegant
        for item in "$@"; do
                # Find the backup chain name
                if [[ "$item" =~ --backup-chain=.* ]]; then
                        BC="$(echo "${item}" | sed -e 's/--backup-chain=//' -e 's/\"//g' -e "s/'//g")"
                        [[ -z "$BC" ]] && BC="$BC" || BC=".$BC"
                fi
                # Check whether the option --backup-chain os set
                if [[ "$item" =~ --verbose-mode.* ]]; then cp_options="-pvir"; else cp_options="-pir"; fi
        done

        # Check whether there are other input parameters different than the option --backup-chain, if there is not - output the info message and exit
        if [ "$(echo "$@" | sed -e 's/--backup-chain=/./' -e 's/\"//g' -e "s/'//g")" == "${BC}" ]; then info_message && exit 1; fi

        # Output the backup chain name
        [[ -z "$BC" ]] && echo "Backup chain: .N" || echo "Backup chain: ${BC}.N"

        # The main part - create backup copies
        for item in "$@"; do
                if [[ ! "$item" =~ --backup-chain=.* ]] && [[ ! "$item" =~ --verbose-mode.* ]]; then
                        LAST="$(ls -1d "${item}${BC}".* 2>/dev/null | awk -F'.' '{print $(NF)}' | grep -Po '[0-9]+' | sort | tail -n1)"
                        cp "$cp_options" "${item}" "${item}${BC}.$((LAST+1))"
                fi
        done
else
        info_message
fi
0
ответ дан 2 November 2019 в 01:11

Другие вопросы по тегам:

Похожие вопросы: