У Вас есть дочерний вызов _exit (), чтобы не сбрасывать stdio (или другой) буферы, когда дочерний процесс выходит. Так как дочерний процесс составляет точную копию родительского процесса, дочерний процесс все еще имеет то, что родитель имел в "stdout" или "stderr", буферах от <stdio.h>. Вы можете (и быть, в несвоевременные времена) получают двойные выводы путем вызова выхода (), один от atexit обработчиков дочернего процесса, и один от родителя, когда буферы в родительском процессе становятся полными, и сбрасываются.
Я понимаю вышеупомянутые концентраты ответа на stdio.h специфических особенностях, но та идея, вероятно, переносит на другой буферизированный ввод-вывод, как один из ответов выше указывает.
Можно моделировать команду как,
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 таким образом заставляет запрос передавать отдельные файлы, не родительский каталог файлов.
Смонтируйте удаленный каталог по 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
(Предупреждение: код выше был введен непосредственно в браузер, я не протестировал его.)