Come stampare file che sarebbero stati modificati usando rsync?


32

C'è un modo per ottenere rsync per stampare i percorsi file completi su tutti i file che sono diversi senza trasferire effettivamente alcun file?

In alternativa, ho bisogno di un modo per diffondere i file tra due alberi (su SSH) basandomi solo sulla modifica delle dimensioni o sull'ora dell'ultima modifica.

Risposte:


33

Rsync ha dry-runun'opzione:

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

Non sono sicuro se questo è quello che vuoi.

Se si desidera eseguire diffil file su due alberi, è possibile cercare ricorsivamente le due direzioni con find e pipe per l'output in ls e pipe in un file. È quindi possibile utilizzare diffper confrontare i file.


3
+1, questo è integrato in rsync. I dettagli dell'output di --dry-rundipenderanno dall'uso di -ve --progress options- quindi se non si ottiene alcun output, controllare che queste opzioni siano impostate come necessario. Ho notato che invierà i nomi delle directory anche quando i file non sono cambiati, ma puoi filtrarli passando l'output sedo simili.
David Spillett,

4
Ma --dry-run sembra mostrare i file anche se sono identici.
Quantum7,

14

Preferisco usare il formato --out per vedere i dettagli, eseguendo il piping a meno:

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

7

rsync -rvn localdir targetdir

-N significa mostrare solo le azioni (senza che venga eseguita alcuna azione).

Nota che hai bisogno della 'v' o non ti mostrerà nulla! (il resto delle risposte dimentica questo ...)


2
Per i follower -n equivale a "--dry-run" :)
rogerdpack il

1

Sulla base di altre risposte e /server//a/618740/114520

  • utilizzare --dry-run(o -n) per evitare modifiche
  • usa --itemize-changes(o -i) per trovare le modifiche
  • usa --archive(o -a) per ottenere tutte le sottodirectory
  • utilizzare egrepper filtrare le voci che iniziano per punto (nessuna modifica)

Che ti dà: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\."

Se vuoi solo un modo, puoi cambiare il comando:

  • per le modifiche dall'origine alla destinazione: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|<)"
  • per le modifiche da destinazione a fonte: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|>)"

E se hai bisogno solo dei file, aggiungi solo awkmagia:rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\." | awk '{print $2}'


0

Vorrei andare per qualcosa del genere:

#! /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"

Per esempio:

$ cd svn 
$ rsyncmeld myproject othermachine:myproject -v --exclude '*.svn' --exclude build

0

La verità della questione è che se si esegue rsync -v ...e viene emesso un nome di file sullo schermo, quel file viene trasferito (o sarebbe stato trasferito, se si sta eseguendo una --dry-run). Per accertare perché rsync stava per trasferirlo, utilizzare la modalità itemize: /server//a/618740/27813

Come altri hanno notato, per impostazione predefinita rsync confronta solo in base alla dimensione del file e al timestamp, che devono corrispondere a entrambi altrimenti viene avviata una "copia delta" su quel file. Se vuoi davvero vedere quali file sono diversi, usa la modalità checksum "-c".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.