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


26

Я використовую rsync в скрипті bash, щоб синхронізувати файли між кількома серверами та NAS. Одне питання, з яким я зіткнувся, намагається створити список файлів, які були змінені під час rsync.

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

Хтось знайшов спосіб виконати таке завдання?

# specify the source directory
source_directory=/Users/jason/Desktop/source

# specify the destination directory
# DO NOT ADD THE SAME DIRECTORY NAME AS RSYNC WILL CREATE IT FOR YOU
destination_directory=/Users/jason/Desktop/destination

# run the rsync command
rsync -avz $source_directory $destination_directory

# grab the changed items and save to an array or temp file?

# loop through and chown each changed file
for changed_item in "${changed_items[@]}"
do
        # chown the file owner and notify the user
        chown -R user:usergroup; echo '!! changed the user and group for:' $changed_item
done

→ дивіться тут мою анверу . Також -iдля деталізації, але ще з декількома поворотами ...
Френк Нокк

Відповіді:


42

Ви можете використовувати параметр rsync --itemize-changes( -i), щоб створити прохідний вихід, який виглядає приблизно так:

~ $ rsync src/ dest/ -ai
.d..t.... ./
>f+++++++ newfile
>f..t.... oldfile

~ $ echo 'new stuff' > src/newfile

~ $ !rsync
rsync src/ dest/ -ai
>f.st.... newfile

>Символ в першій позиції вказує на файл був оновлений, інші символи вказують , чому, наприклад , тут sі tвказати , що розмір файлу і відмітка часу змінилися.

Швидкий і брудний спосіб отримати список файлів:

rsync -ai src/ dest/ | egrep '^>'

Очевидно, що більш вдосконалений синтаксичний аналіз може отримати більш чистий вихід :-)

Я натрапив на це чудове посилання, намагаючись дізнатись, коли --itemize-changesбув представлений, дуже корисний:

http://andreafrancia.it/2010/03/understanding-the-output-of-rsync-itemize-changes.html (заархівоване посилання)


2
Для більш чистого виходу, як згадувалося, rsync -zaic src/ dest/ | grep '^?c' | cut -d' ' -f2 --dry-runбуло б перераховано лише модифіковані файли ( різні контрольні суми ), безумовно, зберігач, thx :) FYI, що ставить --dry-runпісля команди замість цього nпараметра, для мене найкраща практика
MediaVince

По суті те саме, що rsync -zavc src/ dest/ --dry-runбез багатослівного
MediaVince

14

Використовуйте -nпрапор у поєднанні з -cпрапором контрольної суми та -iпрапором:

# rsync -naic test/ test-clone/
>fcst...... a.txt
>fcst...... abcde.txt
>fcst...... b.txt

У цьому прикладі змінився лише один файл на основі вмісту самого файлу. Однак синхронізація файлів не робиться через -nпрапор

Бонус

Якщо ви хочете запустити chown на змінених файлах, розберіть їх з sedподібними або подібними та обробіть, наприклад, xargs:

rsync -naic test/ test-clone/ | sed 's/............//' | xargs -I+ sudo chown root "test-clone/+"

3
sed->cut -d ' ' -f2,-
МУЙ Бельгія

-n --dry-run, -c --checksum,-i --itemize-changes
ThorSummoner

Я не слідкую. Усі 3 файли в прикладі позначені "> fcst", що я розумію, означає "отримувати з віддаленого", контрольна сума відрізняється, розмір відрізняється, час відрізняється. Що у висновку вказує на те, що "змінився лише один файл" ??
bobpaul

1

Це питання трохи старе, але я думаю, що його варто додати:

-i це ярлик --out-format=%i%n%L

І %nозначає ім'я файлу, (розділ log formatпро man rsyncd.conf)

PS rsync версії 3.1.0


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