comando encadeado para criar diretórios em um servidor remoto

0

Para fazer o cronjob do rsync funcionar, primeiro eu preciso criar a árvore dir no servidor remoto antes de executar o rsync. Os diretórios locais devem ser espelhados (sem conteúdo) para o servidor remoto. Estou lutando para fazer isso.

O que eu preciso é stg assim:

find /home/local_directories/onedir/* -type d -exec sh -c "ls -dlts {}"  \; | 
    cut -d" " -f10 | uniq | ssh user@server mkdir -p /tmp/{xargs}  

O ponto difícil é como colocar o último tubo em funcionamento?

EDIT: o comando rsync é assim (tentei também com -R):

/usr/bin/rsync -e ssh -arz --stats --force /home/local_directories/onedir/ user@server:port:/exitsing/path/to/remote/dir/  

A árvore fonte é um svn hotcopy (/ conf, / db, / hooks, / dav, ...)

Thx

    
por hornetbzz 28.02.2011 / 01:11

2 respostas

1

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"
    
por 28.02.2011 / 01:21
0

Eu não entendo muito bem o que você está tentando alcançar aqui. Eu uso o rsync o tempo todo e nunca tive que pré-criar quaisquer diretórios no servidor.

rsync -avP /home/local_directories/onedir/ user@server:/where/to/sync/to/

deve apenas espelhar a árvore inteira sob onedir do local para o remoto.

    
por 28.02.2011 / 01:18

Tags