Параметр Rsync - видалити не видаляє файли в цільовому каталозі


14

Я намагаюся використовувати --deleteпараметр в, rsyncщоб видалити файли в цільовому каталозі, який відсутній у вихідному каталозі

Ось команда, яку я використовую:

rsync -avz --ignore-existing --recursive --delete /var/www/* root@mydomaintest.com:/var/www

Отже, моє запитання полягає в тому, як я можу видалити всі файли з цільового каталогу, які відсутні в оригінальному каталозі?

Відповіді:


14

Використовуйте цю команду:

rsync --archive --verbose --compress --ignore-existing --delete /var/www/ root@mydomaintest.com:/var/www

Вам не потрібно "*" і не слід також його використовувати.

Щоб виключити / включити файли чи каталоги, слід використовувати ці параметри:

--exclude 'to_exclude*'
--include 'to_include*'

Гаразд, спробуйте це :)
користувач2028856

2
Тож "*", що призводить до того, що команда --delete не працює?
користувач2028856

2
Ось як це виглядає. :)
AB

3
--recursiveє надмірним, оскільки варіант -aвже включає його
Темак

1
"*" Може бути важливим у деяких випадках, оскільки він виключає файли / каталоги, які починаються з ".". Наприклад, я використовую його під час використання rsync для копіювання каталогу, який підтримується під git, з розроблювальної машини на виробничу машину. Я не хочу синхронізувати каталог репозиторію .git або файли, такі як .gitignore, лише робоче дерево, включаючи файли верхнього рівня, а також підкаталоги.
sootsnoot

14

Ваша команда не працює, тому що, коли ви використовували /var/www/*як джерело, ваша оболонка виконує глобалізацію на ній, тобто оболонка розширюється *до всіх файлів у цьому каталозі та копіює файли по одному, тому тут окремі файли стали джерелами, а не батьківський каталог.

Отже, якщо ви використовуєте /var/www/*, то вам не потрібен --recursiveваріант, оскільки *це призведе до копіювання файлів (разом із будь-якими каталогами з їх вмістом), а не батьківського каталогу, який містить файли. З тієї ж причини --deleteне працює, оскільки --deleteвилучите файли з каталогу призначення , які не знаходяться у вихідному каталозі , але ви копіюєте файли, щоб їх не видалити файли (як очікується).

Це зробить вас більш зрозумілими:

/foo$ ls -l
-rw-rw-r-- 1 user user    0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user    0 Apr 16 17:56 spam
drwxrwxr-x 2 user user 4096 Apr 16 18:14 test


/bar$ ls -l
-rw-rw-r-- 1 user user 0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user 0 Apr 16 18:13 lion
-rw-rw-r-- 1 user user 0 Apr 16 17:56 spam


$ rsync -avz --ignore-existing --recursive --delete 
/foo/* /bar/

+ rsync -avz --ignore-existing --recursive --delete 
/foo/egg /foo/spam /foo/test /bar/

sending incremental file list
test/
test/hello

sent 173 bytes  received 39 bytes  424.00 bytes/sec
total size is 0  speedup is 0.00


/bar$ ls -l
-rw-rw-r-- 1 user user    0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user    0 Apr 16 18:13 lion
-rw-rw-r-- 1 user user    0 Apr 16 17:56 spam
drwxrwxr-x 2 user user 4096 Apr 16 18:14 test

Як ви бачите, я використовував джерело, /foo/*отже rsync, виконується команда

rsync -avz --ignore-existing --recursive --delete /foo/egg 
/foo/spam /foo/test /bar/

із *створенням оболонки, щоб розширити її та зробити всі файли окремо як вихідні аргументи, а не батьківський каталог в цілому (і вам також не потрібно --recursiveв цьому випадку).

Отже, якщо ви хочете зробити --deleteроботу, запустіть її так:

rsync -avz --ignore-existing --recursive --delete 
/var/www/ root@mydomaintest.com:/var/www/

4
Відмінне пояснення, що вказує на справжню проблему: використання "*" для розширення списку джерел.
Антоніо Бардацці

Як зазначається в моєму коментарі до прийнятої відповіді, * може бути корисним для виключення таких речей, як файли та каталоги, що починаються з ".". Хоча, як ви зазначаєте, це означає, що файли та каталоги, вилучені з верхнього рівня в джерелі, не будуть видалені з каталогу призначення. Для мене я не байдуже, чи правильно видаляються файли вищого рівня з пункту призначення, лише значення мають файли нижче підкаталогів. Видалення підкаталогу верхнього рівня набагато рідше, ніж його додавання, і я готовий зробити вручну rm -r у пункті призначення в такому малоймовірному випадку.
sootsnoot
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.