
Вот шаги, которые я предпринял:
Создайте несколько тестовых файлов:
/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