rsync не видалить файли за призначенням


22

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

#!/bin/sh

set -x

DIR1=/tmp/1
DIR2=/tmp/2

rm -rf $DIR1
rm -rf $DIR2

mkdir $DIR1
mkdir $DIR2

echo "foo" > $DIR1/a
echo "bar" > $DIR1/b

rsync -a $DIR1/* $DIR2

rm -f $DIR1/a

rsync -a --delete $DIR1/* $DIR2

ls -1 $DIR2

Ось вихід:

+ DIR1=/tmp/1
+ DIR2=/tmp/2
+ rm -rf /tmp/1
+ rm -rf /tmp/2
+ mkdir /tmp/1
+ mkdir /tmp/2
+ echo foo
+ echo bar
+ rsync -a /tmp/1/a /tmp/1/b /tmp/2
+ rm -f /tmp/1/a
+ rsync -a --delete /tmp/1/b /tmp/2
+ ls -1 /tmp/2
a
b

Як бачите, файл "a" все ще присутній у каталозі призначення після rsync запуску вдруге, що не те, що мені потрібно. Чи я зловживаю опцією '--delete'?


Слідкуйте за / * в кінці джерел каталогів. Це призведе до того, що rsync розглядає лише ті файли, а не сам каталог (і відсутність файлів, які вже не існують).
Уолт Стоунбернер

Відповіді:


9

Причина полягає в тому, що ви викликаєте rsync on / tmp / 1 / b, який не буде враховувати файл / tmp / 1 / файл.

Схоже, ваш намір полягає в rsync каталогу / tmp / 1 / - якщо ви використовуєте "/ tmp / 1 /" як джерело, а не окремі файли, він помітить, що "a" було видалено з каталогу та видалити це від цілі.


23

Видаліть *. Як згадується на сторінках man rsync, ця --deleteопція не працює із записами підстановки.

Використовуйте це замість:

rsync -a --delete $DIR1/ $DIR2/

"--delete Це повідомляє rsync видаляти сторонні файли з боку прийому (ті, які не перебувають на стороні надсилання), але лише для каталогів, які синхронізуються. Ви, мабуть, попросили rsync надіслати весь каталог (наприклад, dirабо dir/) без використання підстановки для вмісту каталогу (наприклад dir/*), оскільки підстановочний знак розширюється оболонкою і, таким чином, rsync отримує запит на передачу окремих файлів, а не батьківського каталогу файлів . Файли, які виключаються з передачі, також виключаються з видалено, якщо ви не використовуєте --delete-excludedпараметр або позначте правила як відповідність лише на стороні, що надсилає (див. включення / виключення модифікаторів у розділі ПРАВИЛА ФІЛЬТРА) ".


Це функціонально те саме, що відповідь Свена від 2011 р.
Роуан Хокінс

8

Якщо змінити другий рядок rsync на rsync -a --delete $DIR1/ $DIR2(без *), він буде працювати. Причина полягає в тому, що оболонка розширює *до імен файлів у першому каталозі, що є лише b у вашому випадку, тому rsync відсутній файл a взагалі не буде розглядатися, оскільки команда, яка виконується, насправді rsync -a --delete $DIR1/b $DIR2.

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