Як надрукувати файли, які були б змінені за допомогою rsync?


32

Чи є спосіб отримати rsync для друку повних файлових шляхів до всіх різних файлів без фактичної передачі жодних файлів?

Крім того, мені потрібен спосіб розмежування файлів у двох деревах (над SSH), лише на основі зміни розміру або останнього зміненого часу.

Відповіді:


33

У Rsync є dry-runможливість:

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

Я не впевнений, чи цього ви хочете.

Якщо ви хочете, щоб diffфайли знаходилися через два дерева, можливо, ви можете рекурсивно шукати два напрямки з пошуку та трубою для виведення до ls та передачі обох у файл. Потім ви можете використовувати diffдля порівняння файлів.


3
+1, це вбудовано в rsync. Докладно про вихідний результат --dry-runбуде залежати від вашого використання -vта --progress options- тому якщо у вас взагалі немає результату, перевірте, що ці параметри встановлені за необхідності. Я помітив, що він надсилатиме імена каталогів, навіть коли файли не змінені, але ви можете їх відфільтрувати, пропустивши висновок через sedабо подібне.
Девід Спіллетт

4
Але --dry-run, схоже, показує файли, навіть якщо вони ідентичні.
Quantum7

14

Я вважаю за краще використовувати -out-формат, щоб переглянути деталі, переносячи їх на менше:

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

7

rsync -rvn localdir targetdir

-N означає показувати лише дії (без виконання будь-яких дій).

Зауважте, що вам потрібне 'v', інакше воно нічого не покаже! (решта відповідей забувають це ...)


2
Для прихильників -n еквівалентний "--dry-run" :)
rogerdpack

1

На основі інших відповідей та /server//a/618740/114520

  • використовувати --dry-run(або -n), щоб уникнути модифікацій
  • використовувати --itemize-changes(або -i), щоб знайти зміни
  • використовувати --archive(або -a), щоб отримати всі підкаталоги
  • використовувати egrepдля фільтрації записів, починаючи з крапки (без змін)

Що дає вам: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\."

Якщо ви хочете лише один спосіб, ви можете змінити команду:

  • для змін від джерела до місця призначення: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|<)"
  • для змін від місця призначення до джерела: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|>)"

А якщо вам потрібні лише файли, просто додайте awkмагію:rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\." | awk '{print $2}'


0

Я б хотів щось подібне:

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

Наприклад:

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

0

Правда полягає в тому, що при запуску rsync -v ...і виводить ім'я файлу на екран, то цей файл буде переноситься (або був би переданий, якщо ви робите --dry-бег). Щоб з’ясувати, чому rsync збирався перенести його, скористайтеся режимом деталізації: /server//a/618740/27813

Як зазначали інші, rsync за замовчуванням просто порівнює на основі розміру файлу та часової позначки, які обоє повинні відповідати іншому, в цьому файлі запускається "дельта копія". Якщо ви дійсно хочете побачити, які файли відрізняються, використовуйте режим контрольної суми "-c".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.