Backup de um arquivo quando editado, e dar um carimbo de tempo? [duplicado]

2

Eu quero fazer backup de um arquivo específico em outra pasta toda vez que o arquivo for alterado. Idealmente, o arquivo de backup deve ter um registro de data e hora quando for feito o backup. Por exemplo:

Arquivo de trabalho do diretório

~/workfile

Diretório de backups

~/backup/workfile-2014-11-24-10:30
~/backup/workfile-2014-11-24-11:10
~/backup/workfile-2014-11-24-12:40
~/backup/workfile-2014-11-24-15:42
~/backup/workfile-2014-11-24-16:30

Eu gostaria de ter uma solução sem usar a GUI.

    
por sfas sdf 24.11.2014 / 13:08

3 respostas

0

Não tenho certeza absoluta de qual é o caso de uso aqui. Mas em vez de ter "backups" feitos de arquivos de acordo com um registro de data e hora específico não é melhor apenas armazenar alterações entre versões?!

Se os arquivos não forem binários, como texto ou código-fonte, use git

se eles forem binários, eu usaria o rsnapshot, pois ele cria automaticamente uma estrutura de pastas paralelas com as versões de cada arquivo, mas mantendo apenas uma cópia dos arquivos que realmente possuem alterações neles (economizando espaço)

SALVANDO-o em uma pasta de acordo com a hora do instantâneo. por exemplo dia2 / hora3

armazenar a data no próprio nome do arquivo parece redundante. O rsnapshot mantém essa informação através da estrutura de pastas que cria para backups e você também pode vê-lo na data do próprio arquivo.

O GIT mostrará a data de confirmação para cada alteração comprometida em cada arquivo.

    
por tomodachi 24.11.2014 / 13:21
0

Não testado, mas eu abordaria o problema desta maneira:

O script:

#!/bin/bash
BACKUP_LOCATION='backup'
FILE_TO_MONITOR='workfile'
PREVIOUS_MD5='000'

if [ ! -d "$BACKUP_LOCATION" ]
then
    mkdir -p "$BACKUP_LOCATION"
    echo "Init backup dir..."
fi

while true
do
MY_TIMESTAMP='date +"%Y-%m-%d-%H:%M:%S"'
MY_MD5='md5sum "$FILE_TO_MONITOR"'
if [ "$MY_MD5" != "$PREVIOUS_MD5" ]
    then
    cp -f "$FILE_TO_MONITOR" "${BACKUP_LOCATION}/${FILE_TO_MONITOR}-${MY_TIMESTAMP}"
    PREVIOUS_MD5=$MY_MD5
    echo "File changed at $MY_TIMESTAMP."
    fi
done

O procedimento: execute este script como daemon. A saída que você pode redirecionar para um arquivo de log mesmo.

    
por Frantique 24.11.2014 / 13:27
0

Na minha opinião, trabalho de milho é uma alternativa melhor do que qualquer loop infinito. Eu estou supondo que a pasta ~/backup já existe. Pode-se definir um job de milho para executar o seguinte script em um intervalo de n minutos, dependendo de sua necessidade. Ele servirá ao propósito.

Execute o script em um intervalo de 5 minutos

Crontab do usuário aberto (arquivo de configuração do cron) de um terminal como crontab -e . Adicione a seguinte linha para executar o script em um intervalo de 5 minutos,

*/5 * * * * /path/to/script

Não se esqueça de dar ao script a permissão de execução : chmod u+x /path/to/script

O script

#!/bin/bash
msrc="/home/$USER"
mdst="/home/$USER/backup"
msrcfile="workfile"
mnewfile="$msrcfile"-$(date +"%Y-%m-%d-%H:%M")
checkfile="$(for i in "$mdst"/*; do echo "$i"; done | xargs ls -1t > /dev/null 2>&1 | head -1)"

if [[ "$msrc"/"$msrcfile" -nt "$checkfile" ]]; then
    cp "$msrc"/"$msrcfile" "$mdst"/"$mnewfile"
fi

De man bash :

CONDITIONAL EXPRESSIONS
file1 -nt file2
          True if file1 is newer (according to modification date) than file2, or if  file1
          exists and file2 does not.

De man ls :

-t     sort by modification time, newest first
    
por souravc 24.11.2014 / 19:45