Как описано здесь, вы можете написать небольшой сценарий оболочки:
for dest in $(
Вам просто нужно создать destinations.txt
файл, в котором вы заполните в каждой строке пункт назначения user@host
, что-то вроде следующего, например. :
root@192.168.1.65
phphil@unix.stackexchange.com
Обратите внимание, что путь назначения (/remote/path/
) жестко закодирован в скрипте, это означает, что этот путь должен существовать на обоих серверах. Если вы предпочитаете устанавливать выделенный путь для каждого места назначения, вы можете отредактировать скрипт, удалить :/remote/path/
и установить его для каждой записи в destinations.txt
.
В противном случае вы можете взглянуть на parallel-scp
Я не знаю ни одной команды, которая точно соответствовала бы вашим требованиям. Что-то вроде этого должно работать (удалите --dry-run
когда вы уверены, что довольны результатом; замените --verbose
на --quiet
, если вы хотите, чтобы он работал тише):
src=/path/to/source
dst=/path/to/target
comm -z -23 \
<(find "$src" -type f -printf '%P\0' | sort -z) \
<(find "$dst" -type f -mmin -60 -printf '%P\0' | sort -z) |
rsync --dry-run --verbose --archive --from0 --files-from - "$src" "$dst"
Предполагается, что относительно новые утилиты понимают, как обрабатывать строки, завершающиеся NUL -. При необходимости и при условии, что вы можете гарантировать, что имена файлов не содержат символов новой строки, вы можете удалить три флага -z
и rsync
--from0
и заменить \0
в командах find
на \n
.
Если все ваши копии относятся к существующим файлам, вы можете посмотреть на это по-другому :перезаписать локальные файлы, если они старше одного часа. Таким образом, с каталогом назначения в качестве рабочего каталога:
find. -mindepth 1 -maxdepth 1 -type f -mmin +60 -exec cp /source/directory/{}. \;
где:
find. -mindepth 1 -maxdepth 1 -type f -mmin +60
находит локальные файлы старше часа -exec cp /source/directory/{}. \;
перезаписывает их своим тезкой из/source/directory