У меня есть 2 каталога: src и dst. Src содержит только 1 файл "index.php". Dst содержит "index.php" И "readme.txt". У меня также есть файл list.txt, который содержит только одну строку: «index.php».
Теперь, находясь в каталоге, содержащем как src, так и dst, я выполняю следующую команду:
rsync -av --include-from=list.txt src/ dst/ --del
Он обновляет файл "index.php", если это необходимо, НО он также удаляет readme.txt.
Почему его удаляет, если его нет в файле list.txt? Есть ли простой способ «исправить» такое поведение?
В основном я хочу, чтобы rsync заботился только о файлах из списка. Они могут нуждаться в обновлении или удалении (например, параметр --del), но я не хочу, чтобы он касался других файлов. Я не могу использовать параметр «--files-from», потому что он не удаляет файлы в месте назначения.
РЕДАКТИРОВАТЬ: «index.php» был здесь просто примером - на самом деле слишком простым примером, потому что src и dst могут содержать целые деревья каталогов, поэтому, если list.txt имеет запись типа «abc / test.php», она также должна работать для этот файл.
Это может показаться излишним, однако у меня это сработало:
rsync -r -av --include-from=list.txt --files-from=list.txt --delete-missing-args src/ dst/
однако он будет специально обновлять файл в зависимости от того, какой из них был обновлен / удален.
т.е. если файл с тем же именем находится в другом подкаталоге, он не будет изменен или удален, а только изменится или удалится в зависимости от того, где он находится в src / parent-directory.
Решение - добавить --exclude=*
:
rsync --verbose -r --del --include-from=list.txt --exclude=* src/ dst/
Обновит только файлы из list.txt
и удалить из dst
только если они отсутствуют в src
и включены в list.txt
.