Jak wydrukować pliki, które zostałyby zmienione przy użyciu rsync?

32

Czy istnieje sposób, aby rsync wydrukował pełne ścieżki plików do wszystkich plików, które są różne, bez faktycznego przesyłania plików?

Alternatywnie, potrzebuję sposobu różnicowania plików między dwoma drzewami (przez SSH) wyłącznie na podstawie zmiany rozmiaru lub czasu ostatniej modyfikacji.

Joe Tsai
źródło

Odpowiedzi:

33

Rsync ma dry-runopcję:

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

Nie jestem pewien, czy tego właśnie chcesz.

Jeśli chcesz, aby diffpliki znajdowały się w dwóch drzewach, być może możesz rekurencyjnie przeszukać dwa kierunki za pomocą funkcji find i potoku, aby wyświetlić dane wyjściowe do ls i potokować oba pliki. Następnie możesz użyć diffdo porównania plików.

Vincent
źródło
3
+1, jest wbudowany w rsync. Szczegóły danych wyjściowych --dry-runzależą od użycia -vi --progress options- jeśli więc nie otrzymasz danych wyjściowych, sprawdź, czy te opcje są ustawione zgodnie z potrzebami. Zauważyłem, że wyśle ​​nazwy katalogów, nawet jeśli pliki się nie zmieniły, ale możesz je odfiltrować, przekazując dane wyjściowe sedlub podobnie.
David Spillett
4
Ale --dry-run wydaje się wyświetlać pliki, nawet jeśli są identyczne.
Quantum7,
14

Wolę używać formatu --out, aby zobaczyć szczegóły, przesyłając mniej:

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

rsync -rvn localdir targetdir

-N oznacza pokazywanie tylko akcji (bez wykonywania żadnej akcji).

Pamiętaj, że potrzebujesz „v”, bo inaczej nic ci nie pokaże! (reszta odpowiedzi zapomina o tym ...)

Hugo Zaragoza
źródło
2
Dla obserwujących -n jest równoważne z „--dry-run” :)
rogerdpack
1

Opierając się na innych odpowiedziach i /server//a/618740/114520

  • użyj --dry-run(lub -n), aby uniknąć modyfikacji
  • użyj --itemize-changes(lub -i), aby znaleźć zmiany
  • użyj --archive(lub -a), aby uzyskać wszystkie podkatalogi
  • służy egrepdo odfiltrowywania wpisów zaczynających się od kropki (bez zmian)

Co daje ci: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\."

Jeśli chcesz tylko jeden sposób, możesz zmienić polecenie:

  • dla zmian ze źródła do miejsca docelowego: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|<)"
  • dla zmian z miejsca docelowego na źródło: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|>)"

A jeśli potrzebujesz tylko plików, po prostu dodaj awkmagię:rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\." | awk '{print $2}'

Yvan
źródło
0

Wybrałbym coś takiego:

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

Na przykład:

$ cd svn 
$ rsyncmeld myproject othermachine:myproject -v --exclude '*.svn' --exclude build
Raúl Salinas-Monteagudo
źródło
0

Prawda jest taka, że ​​jeśli uruchomisz rsync -v ...i wyświetli ona nazwę pliku na ekranie, plik ten jest przesyłany (lub zostałby przeniesiony, jeśli wykonujesz --dry-run). Aby ustalić, dlaczego rsync miał zamiar go przenieść, użyj trybu wyszczególnienia: /server//a/618740/27813

Jak zauważyli inni, domyślnie rsync po prostu porównuje na podstawie rozmiaru pliku i znacznika czasu, które muszą się zgadzać, w przeciwnym razie w tym pliku zostanie uruchomiona „kopia delta”. Jeśli naprawdę chcesz zobaczyć, które pliki są inne, użyj trybu sumy kontrolnej „-c”.

rogerdpack
źródło