rsync: mostra quando o arquivo mais novo no destino deve ser sobrescrito

2

Estou executando um comando que atualiza alguns arquivos para um servidor centralizado.
O comando faz primeiro um --dry-run para mostrar quais arquivos serão transferidos.
Pode acontecer que um arquivo mais novo no servidor tenha que ser sobrescrito - e eu gostaria que o comando rsync --dry-run mostrasse especificamente quando é o caso.

Atualmente, o comando rsync parece

rsync -aviO sdir/ ddir

Digamos que o comando produza a saída

 >f.st...... file-newer-on-source
 >f.st...... file-newer-on-destination

por questão de clareza, fazendo rsync -aviuO sdir/ ddir (--update) produzir, normalmente,

 >f.st...... file-newer-on-source

Mas eu gostaria que o comando mostrasse quando um arquivo deve ser sobrescrito enquanto é mais novo! Atualmente não há distinção na saída entre file-newer-on-source e ...-destination . Algo como isso seria ótimo

 >f.st...... file-newer-on-source
 >f.sT...... file-newer-on-destination

mas esse não é o caso.

Existe outra opção, ou uma out-format setup que mostraria especificamente que um arquivo mais recente deve ser sobrescrito?

    
por Ring Ø 30.10.2015 / 08:14

1 resposta

4

O lugar para procurar seria na opção -v (verbose), que pode ser repetida. Isso não dá exatamente as informações solicitadas.

No entanto, você pode construir o que é desejado executando as diferentes partes usando outras opções (consulte manpage ):

-u, --update
skip files that are newer on the receiver

--existing
skip creating new files on receiver

--ignore-existing
skip updating files that exist on receiver

Aqui está um exemplo usando -u e --existing :

#!/bin/sh
# $Id: check-rsync,v 1.1 2015/10/31 01:02:58 tom Exp $
# Make a readable report showing whether files would be added (+), deleted (-),
# updated (>) or downdated (<) using rsync between two directories.
#
# Updates to directories are ignored.
#
# author: Thomas E. Dickey (2015)

usage() {
    cat >&2 <<-EOF
    usage: check-rsync [-d] [source] [target]
EOF
    exit 1
}

OPTS=
while [ $# != 0 ]
do
    case .$1 in
    (.-*)
            OPTS="$OPTS $1"
            ;;
    (*)
            break
            ;;
    esac
done

[ $# = 2 ] || usage
[ -d "$1" ] || usage
[ -d "$2" ] || usage

LANG=C
export LANG

SOURCE=$1
TARGET=$2

MYTEMP=$(mktemp -d)
trap "cd; rm -rf $MYTEMP" EXIT

syncit() {
    rsync -n -vaz --delete $OPTS $SOURCE/ $TARGET | \
            sed     -e '/^\(sending\|sent\|total\) /d' \
                    -e '/^$/d' \
                    -e '/^\.\//d' \
                    -e '/\/$/d' | \
            sort
}

cd $MYTEMP

syncit                      >all-updates
syncit -u                   >was-newer
syncit --existing           >was-existing

comm -23 all-updates was-existing | \
    sed     -e '/^deleting /d' \
            -e 's/^/+ /' >>report
comm -23 all-updates was-newer | \
    sed     -e '/^deleting /d' \
            -e 's/^/< /' >>report
sed -e 's/^deleting /- /' -e t -e d all-updates >>report

comm -12 all-updates was-newer | \
    sed     -e 's/^[[:space:]]\+//' \
            -e '/^deleting /d' -e 's/^/> /' >>report

sort -k2 report

Eu usei isso para comparar duas árvores de diretórios locais (cerca de 10.000 arquivos com cerca de 100 alterações). O script verifica explicitamente que seus parâmetros são diretórios. Essa verificação seria modificada para uso com sistemas remotos, mas como a questão se refere a como usar as opções rsync , em vez do shell script básico, essa alteração não faz parte desse exemplo.

A terceira opção seria útil se um estendesse o script para mostrar = para arquivos inalterados. Mas não tenho utilidade prática para isso: deixe isso como um exercício para o leitor.

    
por 30.10.2015 / 10:19

Tags