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
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).