Итак, у меня, казалось бы, простая проблема, но пока я не нашел решения: я хочу исключить самый верхний каталог из rsync, при этом синхронизируя все его дочерние каталоги. Конкретная проблема в том, что у меня нет разрешения на изменение времени самого верхнего каталога, но я хочу, чтобы все дочерние каталоги имели правильно синхронизированное время.
Я использую следующую команду rsync:
rsync --exclude ./ -rlptDu ./ server.example.com:/usr/local/directory/
и server.example.com:/usr/local/directory/
выглядит так:
drwxrws--- 5 root staff 24576 Jul 9 15:00 .
(мой локальный пользователь является членом staff
)
При запуске rsync возникает следующая ошибка:
rsync: failed to set times on "/usr/local/directory/.": Operation not permitted (1)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1070) [sender=3.0.9]
make: *** [pub_to_mel_internal] Error 23
Это версия 3.0.9 на локальной машине и 3.0.7 на удаленной, обе машины работают под управлением Debian.
решение1
Я думаю, что правила фильтрации rsync не могут соответствовать каталогу верхнего уровня, поэтому он всегда синхронизирован. Обходной путь — синхронизировать все файлы внутри этого каталога, а не сам каталог.
rsync -rlptDu -- * server.example.com:/usr/local/directory/
Добавьте .[!.]*
после *
, если в самом верхнем каталоге есть файлы с точками, и ..?*
если имена файлов начинаются с двух точек.
решение2
Похоже, rsync может исключить самый верхний каталог с помощью --files-from
:
$ rsync -anv from/ to/
sending incremental file list
./
a
b.test
sent 97 bytes received 25 bytes 244.00 bytes/sec
total size is 0 speedup is 0.00 (DRY RUN)
$ printf '%s\n' 'a' 'b.test' | rsync -anv --files-from=- from/ to/
building file list ... done
a
b.test
sent 88 bytes received 22 bytes 220.00 bytes/sec
total size is 0 speedup is 0.00 (DRY RUN)
Просто наткнулся на это и оставляю здесь подсказку, вдруг она кому-то поможет (или мне в будущем).