Comando de backup simples

0

Eu preciso de um comando que gerencie automaticamente a nomenclatura de arquivos para fins de backup. Por exemplo, eu tenho um arquivo chamado test.txt , e às vezes eu manualmente preciso atualizar esse arquivo chamando um script bash que "recalcula" test.txt .

Eu normalmente, antes de chamar o script bash, faço manualmente uma cópia do arquivo com um formato como:

cp test.txt test.txt.bk.x

em que x é o número do último backup + 1.

Eu gostaria de colocar um comando no começo do meu script como:

backup_cp -options_about_backup_filename_format test.txt

que gerencia automaticamente a nomenclatura do próximo arquivo de backup. Eu não preciso obedecer o padrão de nomenclatura de arquivos atual, pode ser qualquer formato seqüencial, por exemplo, como os arquivos de log em /var/log onde o backup n. 1 é sempre o backup mais recente, ou como o atual, em que os números de backup estão em ordem crescente.

Seria fantástico se o comando também pudesse apagar automaticamente os backups antigos.

    
por Peregring-lk 26.10.2017 / 13:09

3 respostas

4

Dê uma olhada no comando logrotate . Você especifica com um arquivo de configuração como fazer backup da versão antiga. Então você ligaria:

logrotate -f config_file

Um exemplo simples de um arquivo de configuração seria:

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

Você tem muitas outras opções como: dateext, postrotate, prerotate, etc.

Com dateext a data é adicionada no final do nome do arquivo, para que você saiba quando o backup foi criado. Post / Pre rotate pode executar algumas tarefas antes e depois do backup.

Se você usa o número, é um pouco diferente como você está acostumado. 1 é o último arquivo e a idade cresce em número.

Não coloque o arquivo de configuração em /etc/logrotate.d/ , porque o logrotate executa automaticamente os arquivos de configuração desse diretório. Você quer executá-lo apenas quando quiser e fornecer o arquivo de configuração para logrotate.

    
por nobody 26.10.2017 / 13:28
0

Você poderia apenas gerar um número e, em seguida, mantê-lo e registrá-lo em um arquivo.

Por exemplo

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

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

Crie um arquivo .id_number com o número como conteúdo com o qual você deseja iniciar e você pode começar a usá-lo.

    
por Ziazis 26.10.2017 / 14:28
0

Eu criei um script bash que é capaz de lidar com tarefas semelhantes.

Os recursos do script

  • O script criará uma cópia de backup do arquivo target ou do diretório . Também pode manipular vários arquivos e (ou) diretórios . O nome do novo arquivo (ou o novo diretório ) será target.N , onde N é o número consecutivo da cópia de backup.

  • O script tem duas opções:

    • --backup-chain=<chain name> - esta opção anexará a string <chain name> ao nome do arquivo de backup e a numeração dessa cadeia será independente das outras cadeias.

    • --verbose-mode - esta opção anexará -v à lista de opções de comando cp .

  • Alguns exemplos de uso são apresentados aqui: link

Configuração

1. Crie um arquivo de script executável, chamado sbcp ( cópia simples de backup ), localizado em /usr/local/bin para ser acessível como comando shell:

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

2. O conteúdo do script 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
    
por pa4080 26.10.2017 / 14:47