Backup de muitos arquivos, mantendo todas as versões antigas

1

Minha pergunta é sobre salvar muitos arquivos de vários diretórios em apenas um diretório, mantendo todas as versões antigas dos arquivos. Eu tenho cerca de 10 diretórios com arquivos muito semelhantes (10 diretórios de backup feitos usando Linux, Windows e MacOS). Eu quero concatenar esses 10 diretórios em apenas um. Por exemplo, eu tenho 3 diretórios a, b e c com o seguinte conteúdo:

  • a

    • fileA.txt (data 10/10/2012)
    • fileB.txt (data 10/12/2012)
    • fileC.txt (data 01/05/2013)
  • b

    • fileA.txt (data 10/01/2013)
    • fileB.txt (data 10/02/2013)
    • fileC.txt (data 01/05/2013)
    • fileD.txt (data 02/05/2013)
  • c

    • fileA.txt (data 10/10/2012)
    • fileB.txt (data 12/02/2013)

O diretório resultante deve ser:

  • fileA.txt (data de 10/01/2013 de b)
  • fileA.txt_20121010hhmmss (de a e c (mesmo arquivo))
  • fileB.txt (data 12/02/2013 do c)
  • fileB.txt_20121210hhmmss (de a)
  • fileB.txt_20130210hhmmss (de b)
  • fileC.txt (data 01/05/2013 de aeb (mesmo arquivo))
  • fileD.txt (data 02/05/2013 de b)

hh = horas mm = minutos ss = segundos

Atualmente, estou trabalhando em um script Perl que pode comparar os arquivos usando a função "compare" e uma soma de verificação md5.

Eu peço para encontrar a data de modificação (se os arquivos forem diferentes), estou usando os metadados (quando posso) usando Exiftool (alguns arquivos compatíveis como docx, ppt pdf jpg ...) caso contrário, estou usando o timestamp usando o comando stat.

O arquivo sem a extensão adicionada deve ser o mais recente de todos os arquivos com o mesmo nome.

O script Perl é muito lento e complexo, portanto, estou procurando uma solução mais robusta.

Obrigado pela sua ajuda.

NB: - Eu quero usar esta solução em um servidor Synology (DS212) no qual eu tenho poucos comandos shell clássicos. Se necessário, posso copiar esses arquivos em uma máquina Linux (ou OSX) para fazer isso.

    
por Guuk 04.06.2013 / 16:39

1 resposta

1

Solução:

cat backup.sh
#!/bin/sh
for i in 'find ./{a,b,c} -type f'
do
  FILE='basename $i'
  FTIME='stat -c %x $i | awk -F"." '{print $1}' | sed 's/[-: ]//g''
  NEWNAME=${FILE}_${FTIME}
  echo "cp $i result/${NEWNAME}"
  cp -p $i result/${NEWNAME}
done
cd result
for i in 'ls -1 | awk -F"_" '{print $1}' | sort -u'
do
  TNAME='ls -1t ${i}* | head -1'
  echo "mv ${TNAME} ${i}"
  mv ${TNAME} ${i}
done

Backup de arquivos no diretório "result".

Como está funcionando (exemplo):

$ ls -l {a,b,c,result}
a:
total 0
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileA.txt
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileB.txt
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileC.txt

b:
total 0
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileA.txt
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileB.txt
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileC.txt
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileD.txt

c:
total 0
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileA.txt
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileB.txt

result:
total 0


~/tmp/backup $ ./backup.sh 
cp ./a/fileA.txt result/fileA.txt_20130606162832
cp ./a/fileB.txt result/fileB.txt_20130606162836
cp ./a/fileC.txt result/fileC.txt_20130606162846
cp ./b/fileA.txt result/fileA.txt_20130606162857
cp ./b/fileD.txt result/fileD.txt_20130606162910
cp ./b/fileB.txt result/fileB.txt_20130606162900
cp ./b/fileC.txt result/fileC.txt_20130606162906
cp ./c/fileA.txt result/fileA.txt_20130606162920
cp ./c/fileB.txt result/fileB.txt_20130606162923
mv fileA.txt_20130606162920 fileA.txt
mv fileB.txt_20130606162923 fileB.txt
mv fileC.txt_20130606162906 fileC.txt
mv fileD.txt_20130606162910 fileD.txt


~/tmp/backup $ ls -l {a,b,c,result}
a:
total 0
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileA.txt
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileB.txt
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileC.txt

b:
total 0
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileA.txt
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileB.txt
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileC.txt
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileD.txt

c:
total 0
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileA.txt
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileB.txt

result:
total 0
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileA.txt
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileA.txt_20130606162832
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileA.txt_20130606162857
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileB.txt
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileB.txt_20130606162836
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileB.txt_20130606162900
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileC.txt
-rw-r--r-- 1 test test 0 Jun  6 16:28 fileC.txt_20130606162846
-rw-r--r-- 1 test test 0 Jun  6 16:29 fileD.txt


~/tmp/backup $
    
por 06.06.2013 / 23:01