Параметр rsync --delete не удаляет скрытые точечные файлы в целевом объекте

Параметр rsync --delete не удаляет скрытые точечные файлы в целевом объекте

Вот шаги, которые я предпринял:

Создайте несколько тестовых файлов:

/tmp $ mkdir src tgt
/tmp $ cd src/
/tmp/src $ touch .test{1,2,3}
/tmp/src $ ls -la
total 0
drwxr-xr-x   5 user  wheel  170 18 Aug 15:02 .
drwxrwxrwt  11 root       wheel  374 18 Aug 15:02 ..
-rw-r--r--   1 user  wheel    0 18 Aug 15:02 .test1
-rw-r--r--   1 user  wheel    0 18 Aug 15:02 .test2
-rw-r--r--   1 user  wheel    0 18 Aug 15:02 .test3

Синхронизируйте каталоги src и tgt:

/tmp/src $ cd ..
/tmp $ rsync -avh --delete --progress src/.??* tgt
building file list ...
3 files to consider
.test1
           0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=2/3)
.test2
           0 100%    0.00kB/s    0:00:00 (xfer#2, to-check=1/3)
.test3
           0 100%    0.00kB/s    0:00:00 (xfer#3, to-check=0/3)

sent 209 bytes  received 86 bytes  590.00 bytes/sec
total size is 0  speedup is 0.00
/tmp $ ls -la tgt/
total 0
drwxr-xr-x   5 user  wheel  170 18 Aug 15:03 .
drwxrwxrwt  11 root       wheel  374 18 Aug 15:02 ..
-rw-r--r--   1 user  wheel    0 18 Aug 15:02 .test1
-rw-r--r--   1 user  wheel    0 18 Aug 15:02 .test2
-rw-r--r--   1 user  wheel    0 18 Aug 15:02 .test3

Удалите файл в src и повторите синхронизацию:

/tmp $ rm -rf src/.test1
/tmp $ ls -la src/
total 0
drwxr-xr-x   4 user  wheel  136 18 Aug 15:03 .
drwxrwxrwt  11 root       wheel  374 18 Aug 15:02 ..
-rw-r--r--   1 user  wheel    0 18 Aug 15:02 .test2
-rw-r--r--   1 user  wheel    0 18 Aug 15:02 .test3
/tmp $ rsync -avh --delete --progress src/.??* tgt
building file list ...
2 files to consider

sent 75 bytes  received 20 bytes  190.00 bytes/sec
total size is 0  speedup is 0.00
/tmp $ ls -la tgt/
total 0
drwxr-xr-x   5 user  wheel  170 18 Aug 15:03 .
drwxrwxrwt  11 root       wheel  374 18 Aug 15:02 ..
-rw-r--r--   1 user  wheel    0 18 Aug 15:02 .test1
-rw-r--r--   1 user  wheel    0 18 Aug 15:02 .test2
-rw-r--r--   1 user  wheel    0 18 Aug 15:02 .test3

Файл .test1 не был удален в каталоге tgt.

Почему в этом случае не работает опция --delete?

Как заставить команду rsync удалить скрытые файлы в целевом объекте?

решение1

Это не имеет ничего общего со скрытыми файлами. После того, как rmвы никогда не говорили, rsyncчтобы заботиться src/.test1вообще. Из man 1 rsync[выделено мной]:

--delete
Это говорит rsyncоб удалении посторонних файлов с принимающей стороны (тех, которые не находятся на отправляющей стороне), нотолько для каталогов, которые синхронизируются. Вы должны были запросить rsyncотправку всего каталога (например, dirили dir/) без использования подстановочного знака для содержимого каталога (например dir/*, )поскольку подстановочный знак раскрывается оболочкой и, rsyncтаким образом, получает запрос на передачу отдельных файлов, а не родительского каталога файлов. […]

Синхронизировать каталоги, а не отдельные файлы:

rsync -avh --delete --progress src/ tgt

решение2

Хитрость заключается в синхронизации каталогов (как упомянул @Kamil Maciorowski), а также в использовании фильтров включения и исключения, чтобы в первую очередь синхронизировались только файлы с точкой:

rsync -avh --delete --progress --include '.*' --exclude '*' src/ tgt

решение3

В моем случае добавление --ignore-errorsрешило проблему.

Подробнее: Использование cygwin для копирования с сервера Linux на USB-накопитель Windows.

Источник — server:/src, а пункт назначения — /cygdrive/e.

Остался скрытый файл от предыдущего запуска rsync. Имя файла было что-то вроде.data.qpSS6L

Выполнение следующей команды сделалонетудалить файл:

rsync -rvvth --update server:/src /cygdrive/e --delete

Следующий код добавляет --ignore-errors и корректно удаляет скрытый файл:

rsync -rvvth --update server:/src /cygdrive/e --delete --ignore-errors

Связанный контент