faz rsync aguardar uma confirmação antes de realmente alterar os arquivos

9

Estou fazendo uma sincronização entre uma pasta local e uma remota. Aconteceu que eu perdi um arquivo por um comando estúpido.

Estou acostumado a uníssono e ao modo como você confirma ("vai?") antes de fazer a transferência real de arquivos.

Existe essa opção com o rsync? (não há uníssono no lado do servidor)

Obrigado!

    
por meduz 13.05.2011 / 12:14

4 respostas

3

Em lugar de uma opção oficial "--confirm", o "modo em lote" do rsync pode ser aproveitado para evitar ter que calcular duas vezes a diferença entre dois caminhos. O modo em lote era destinado a distribuir alterações para espelhos (calcular uma vez, atualizar várias árvores idênticas). Dois arquivos são criados: um arquivo de lote contendo as atualizações e um script simples de conveniência para executar a atualização (há uma seção ao final do página man do rsync com detalhes).

Aqui está um wrapper bash para abstrair o processo:

#!/bin/bash

cleanup ()
{
    rm ${BFILE} ${BFILE}.sh &>/dev/null
}

# generate tmpfile
BFILE=$( mktemp )

# rsync command
if ! rsync --only-write-batch="${BFILE}" --verbose "$@"; then
    cleanup
    exit 1
fi

# confirmation
read -p "Continue (y/N)? " confirm
if [ "$confirm" != "y" ]; then
    echo "Aborting"
    cleanup
    exit 1
fi

# carve up arguments
dest="${@: -1}"         # last argument
host="${dest%%:*}"      # host:path
path="${dest#*:}"
opts="${@:1:$(($#-2))}" # everything but the last two args
if [ "$host" = "${path}" ]; then
    # local
    sh "${BFILE}.sh"
else
    # remote
    ssh "$host" rsync --read-batch=- "${opts}" "${path}" <"${BFILE}"
fi

cleanup

Observe que, como esse script grava em $TMP_DIR , você pode encontrar restrições de espaço se estiver movendo dados realmente grandes (maiores que o / tmp, por exemplo).

    
por 31.01.2013 / 03:25
6

Você pode usar a opção -n com o rsync para executar uma execução a seco. O rsync lhe dirá quais operações ele teria realizado sem realmente executá-las. Se estiver satisfeito com os resultados, volte a correr sem a opção -n.

    
por 14.05.2011 / 00:15
5

Você pode fazer o rsync para fazer backup dos arquivos sobrescritos, usando a opção --backup,

 -b, --backup                make backups (see --suffix & --backup-dir)
     --backup-dir=DIR        make backups into hierarchy based in DIR
     --suffix=SUFFIX         backup suffix (default ~ w/o --backup-dir)

após a execução do rsync, você pode verificar o diretório de backup para arquivos e perguntar, um por um, se ele precisa ser restaurado.

    
por 09.11.2012 / 18:06
4

Infelizmente, não há nenhum método embutido no Rsync no momento da gravação.

A solução de Mike Fitzpatrick funcionará bem, no entanto, se você tiver uma árvore de diretórios muito grande, você pode querer fazer algo que não faça o rsync passar por todos os arquivos novamente

EDITAR: Há também um bug onde ele não vai deletar um arquivo de destino ... quanto mais eu olho, essa solução está quebrada ... eu estou deixando de lado, porque pode funcionar no seu caso e também se alguém quiser consertar isto. Além disso, alguém deve enviar uma solicitação de recurso formal para o link

Eu escrevi este script:

#! /bin/bash

# Make a temp file for storing the output of rsync

tmpfile=$( mktemp )  &&

# Do all the hard work ( get the list of files we need to update ), 
#  but dont actually change the filesystem

rsync --dry-run --out-format='RSYNC_CONFIRM %i %n%L' "$@" | grep RSYNC_CONFIRM | awk '{ print $3 }' > $tmpfile &&


# Output to the user what we propose to do
rsync --dry-run --itemize-changes --files-from=$tmpfile "$@" &&

# Alternatively, we could just output $tmpfile... but whatever...

read -p "Continue? (y/n)?" &&

if [[ $REPLY = [yY] ]]
then
{
  rsync --files-from=$tmpfile "$@"
}
fi

rm $tmpfile
  • Tente colar o script em um arquivo chamado rsync-confirm.bash

  • Em seguida, chmod +x rsync-confirm.bash

  • Em seguida, ./rsync-confirm.bash -rvh /etc/ /tmp/etc/

Esse script pode ser um pouco problemático, notei que ele não gosta muito se você não tem uma barra no diretório de origem ...

    
por 08.11.2012 / 07:53