Não está claro por que você precisa criar todos esses diretórios usando mkdir .
O único diretório que você precisa criar é o próprio diretório de destino, e isso somente se ele ainda não existir. rsync criará todos os subdiretórios se você usar a opção -a ou -v .
Algo como isso deve ser suficiente:
destdir="/home/local_directories/onedir.bak" # or wherever it should go
ssh user@server "mkdir \"$destdir\""
rsync -a /home/local_directories/onedir/ user@server:"$destdir"
Ou, mais corretamente (somente fazendo o diretório se ele não existir):
destdir="/home/local_directories/onedir.bak"
ssh user@server 'destdir="'"$destdir"'"; test -d "$destdir" || mkdir -p "$destdir"'
rsync -a /home/local_directories/onedir/ user@server:"$destdir"
Mas, se você realmente tiver que fazer isso e, por algum motivo, o ls -ltds realmente for necessário, será necessário corrigir o {xargs} bit para fazê-lo funcionar.
A maneira mais correta e eficiente que eu posso pensar em fazer o último bit é:
find ... |
ssh user@server 'while IFS=$'"\n"' read -r dir; do test -d "$dir" || mkdir -p "$dir"; done'
A ideia por trás disso é que só iniciamos find e ssh uma vez. Iniciamos find e ssh juntos em um pipeline, com find enviando sua saída para o servidor remoto sobre ssh .
find produz uma linha de saída por arquivo, em seguida, o loop while read no outro lado lê uma linha por vez e faz algo com ela (nesse caso, faz o diretório).
Se você estava usando xargs , ele estaria executando ssh várias vezes, o que tornaria as coisas mais lentas.
Melhor, mas um pouco mais complicado, é:
find ... -print0 |
ssh user@server 'while read -r -d "$(printf "find /home/local_directories/onedir/ -type d -print0 |
ssh user@server 'while read -r -d "$(printf "destdir="/home/local_directories/onedir.bak" # or wherever it should go
ssh user@server "mkdir \"$destdir\""
rsync -a /home/local_directories/onedir/ user@server:"$destdir"
0")" -r dir; do test -d "$dir" || mkdir -p "$dir"; done'
0")" -r dir; do test -d "$dir" || mkdir -p "$dir"; done'
É melhor porque lida com caracteres estranhos em arquivos, incluindo novas linhas, o que é muito raro e uma má ideia, mas é melhor manipulá-los por precaução.
Então, até onde eu vejo, você deveria estar fazendo algo como:
destdir="/home/local_directories/onedir.bak"
ssh user@server 'destdir="'"$destdir"'"; test -d "$destdir" || mkdir -p "$destdir"'
rsync -a /home/local_directories/onedir/ user@server:"$destdir"