Как реализовать схему вращения с rsync

У Вас есть дочерний вызов _exit (), чтобы не сбрасывать stdio (или другой) буферы, когда дочерний процесс выходит. Так как дочерний процесс составляет точную копию родительского процесса, дочерний процесс все еще имеет то, что родитель имел в "stdout" или "stderr", буферах от <stdio.h>. Вы можете (и быть, в несвоевременные времена) получают двойные выводы путем вызова выхода (), один от atexit обработчиков дочернего процесса, и один от родителя, когда буферы в родительском процессе становятся полными, и сбрасываются.

Я понимаю вышеупомянутые концентраты ответа на stdio.h специфических особенностях, но та идея, вероятно, переносит на другой буферизированный ввод-вывод, как один из ответов выше указывает.

3
23.05.2017, 15:40
2 ответа

Можно моделировать команду как,

rsync -vrzO --delete -e ssh <remote_host>:'<remote_dir>/file1 <remote_dir>/file2' <destination_dir>/ т.е. замена выводом cd <remote_dir> && ls -t $PWD/* | head -n 2.

rsync's --delete работы над каталогами и Вашей заменой команды предоставляют список файлов. Так --delete не работает.

Выборка от man rsync:

- удалить

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

3
27.01.2020, 21:24
  • 1
    я не уверен, что понимаю первую часть нашего ответа: что Вы подразумеваете "под моделированием моей команды"? Таким образом, заключение состоит в том, что то, что я хочу сделать (с единственным вызовом rsync) просто невозможно, то, что это? –  cjauvin 26.11.2011, 01:36
  • 2
    Это означает, что можно попробовать команду путем явного помещения немногих имен файлов вместо команды, которой заменят, который дает Вам список последних файлов. –  Sachin Divekar 26.11.2011, 07:39

Смонтируйте удаленный каталог по sshfs. Затем можно рассматривать его как локальный каталог.

Теперь, в файлы вида ко времени изменения, самым легким путем являются спецификаторы шарика zsh. 25 новых файлов в каталоге

*(NDom[1,25])

Так, если Вы хотите скопировать сначала, затем удалите посторонние файлы в месте назначения:

for x in source/*(NDom[1,25]); do
  y=destination/${x:t}
  if [[ ! -e $y || $x -nt $y ]]; then cp -p $x $y; fi
done
destination_files=(destination/*(NDom[1,25]))
if [[ ${#destination_files} -gt 25 ]]; then
  shift $((${#destination_files} - 25)) destination_files
  rm $destination_files
fi

Вот другой метод, который удаляет файлы перед копированием. Этот удаляет самый старый файл, когда он собирается скопировать новый файл и уже существует полное дополнение в месте назначения.

destination_files=(destination/*(ND)); destination_count=$#destination_files
for x in source/*(NDom[1,25]); do
  y=destination/${x:t}
  if [[ $destination_count -gt 25 && ! -e $y ]]; then rm destination/*(NDom[-1]); fi
  if [[ ! -e $y || $x -nt $y ]]; then cp -p $x $y; fi
done

(Предупреждение: код выше был введен непосредственно в браузер, я не протестировал его.)

0
27.01.2020, 21:24

Теги

Похожие вопросы