Como imprimir arquivos que teriam sido alterados usando o rsync?

32

Existe uma maneira de fazer com que o rsync imprima os caminhos de arquivo completos em todos os arquivos diferentes sem realmente transferir nenhum arquivo?

Como alternativa, eu preciso de uma maneira de diferenciar os arquivos em duas árvores (sobre SSH) com base apenas na mudança de tamanho ou na hora da última modificação.

Joe Tsai
fonte

Respostas:

33

O Rsync tem uma dry-runopção:

-n, --dry-run               show what would have been transferred

Não tenho certeza se é isso que você deseja.

Se você quiser diffos arquivos em duas árvores, talvez possa pesquisar recursivamente as duas direções com find e canal para gerar ls e canalizar ambos para um arquivo. Você pode usar diffpara comparar os arquivos.

Vincent
fonte
3
+1, isso é incorporado ao rsync. Os detalhes da saída de --dry-rundependerão do uso do -ve --progress options- portanto, se você não obtiver saída, verifique se essas opções estão definidas conforme necessário. Percebi que ele enviará nomes de diretórios mesmo quando os arquivos não foram alterados, mas você pode filtrá-los passando a saída sedou algo semelhante.
precisa
4
Mas --dry-run parece mostrar arquivos mesmo que sejam idênticos.
Quantum7
14

Prefiro usar o formato --out para ver os detalhes, canalizando-o para menos:

rsync -azh --dry-run --delete-after --out-format="[%t]:%o:%f:Last Modified %M" source destination | less
kabZX
fonte
7

rsync -rvn localdir targetdir

O -n significa mostrar apenas ações (sem que nenhuma ação seja executada).

Observe que você precisa do 'v' ou ele não mostra nada! (o restante das respostas esquece isso ...)

Hugo Zaragoza
fonte
2
Para os seguidores -n é equivalente a "--dry-run" :)
rogerdpack
1

Com base em outras respostas e https://serverfault.com/a/618740/114520

  • use --dry-run(ou -n) para evitar modificações
  • use --itemize-changes(ou -i) para encontrar alterações
  • use --archive(or -a) para obter todos os subdiretórios
  • use egreppara filtrar entradas começando por ponto (sem alteração)

O que lhe dá: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\."

Se você quer apenas uma maneira, você pode alterar o comando:

  • para alterações da origem ao destino: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|<)"
  • para alterações do destino à origem: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|>)"

E se você precisar apenas dos arquivos, basta adicionar awkmágica:rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\." | awk '{print $2}'

Yvan
fonte
0

Eu iria para algo como isto:

#! /bin/bash 

set -eu   ## Stop on errors and on undefined variables

## The local directory name
LOCAL_DIR=$1
## The remote directory in rsync sintax. Example: "machine:directory"
REMOTE_DIR=$2

shift 
shift 
# Now the first two args are gone and any other remaining arguments, if any, 
# can be expanded with $* or $@

# Create temporary file in THIS directory (hopefully in the same disk as $1:
# we need to hard link, which can only made in the same partition)
tmpd="$(mktemp -d  "$PWD/XXXXXXX.tmp" )"

# Upon exit, remove temporary directory, both on error and on success
trap 'rm -rf "$tmpd"' EXIT

# Make a *hard-linked* copy of our repository. It uses very little space 
# and is very quick 
cp -al "$LOCAL_DIR" "$tmpd"

# Copy the files. The final «"$@"» allows us to pass on arguments for rsync 
# from the command line (after the two directories).
rsync -a "$REMOTE_DIR"/   "$tmpd/"  --size-only "$@"

# Compare both trees
meld "$LOCAL_DIR"  "$tmpd"

Por exemplo:

$ cd svn 
$ rsyncmeld myproject othermachine:myproject -v --exclude '*.svn' --exclude build
Raúl Salinas-Monteagudo
fonte
0

A verdade é que, se você executar rsync -v ...e emitir um nome de arquivo para a tela, esse arquivo estará sendo transferido (ou teria sido transferido, se você estiver executando um --dry-run). Para verificar por que o rsync estava prestes a transferi-lo, use o modo de detalhamento: https://serverfault.com/a/618740/27813

Como outros observaram, por padrão, o rsync apenas se compara com base no tamanho do arquivo e no registro de data e hora, os quais precisam corresponder, caso contrário uma "cópia delta" é iniciada nesse arquivo. Se você realmente deseja ver quais arquivos são diferentes, use o modo de soma de verificação "-c".

rogerdpack
fonte