Apenas corte & colando algumas coisas por aí, colocando até o começo ...
until find ./path -mindepth 1 -maxdepth 1 -type d | xargs -r -t -n 1 -P 4 -I % rsync -am %/ $host::%/
do
echo "TRY AGAIN"
done
Isso executa o find ... | xargs ... até que ele retorne verdadeiro.
Para executar o rsync em um único diretório que falha, é necessário um rsync para apenas um diretório, sem xargs, e tente dividir o find e o test / loop (pode falhar se houver novas linhas ou caracteres malucos nos nomes de dir):
for dir in $( find ./path -mindepth 1 -maxdepth 1 -type d )
do
until rsync -am %/ $host::%/ $dir # Or replace with whatever single dir rsync works best for you
do
echo "TRY AGAIN"
sleep 2
done
done
Este próximo provavelmente é a resposta pela qual você está esperando, os xargs chamam uma função várias vezes e a função faz a parte "repetir se falhou":
doitright(){
until rsync -am "$@"/ $host::"$@"/ "$@"
do
echo "TRY AGAIN"
sleep 2
done
}
export -f doitright
find ./path -mindepth 1 -maxdepth 1 -type d | xargs -r -t -n 1 -P 4 -I{} bash -c "doitright {}"