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"