Alguma idéia para simplificar a estranha expressão rsync abaixo?

3

Aqui está a expressão:

rsync -avz --progress -e "ssh -i /where/is/my/id_dsa" [email protected]:'ssh -i /where/is/my/id_dsa  [email protected] "find /remote/source/dir -type f -name '*.sql' | sort -nr | head -1"' .

Procura um arquivo SQL novo no host remoto some.host em / remote / source / dir com o usuário vivek e copia para dir atual no localhost, ele usa /where/is/my/id_dsa chave para ssh e rsync autorização.

Então, este backquoted ssh -i ... me assusta muito. Mas eu não vejo outra maneira de encontrar o arquivo necessário. Como posso simplificar isso?

    
por coldday 25.01.2013 / 13:05

2 respostas

3

Você pode simplificar o comando adicionando a configuração abaixo em seu .ssh / config:

    host some.host
        identityfile /where/is/my/id_dsa
        user vivek

Agora seu comando seria simplesmente

rsync -avz --progress -e "ssh some.host:'ssh some.host "find /remote/source/dir -type f -name '*.sql' | sort -nr | head -1"' .

Normalmente eu prefiro --partial --progress do que --progress, e tem uma opção mais curta 'P', então seu comando seria

rsync -avzPe "ssh some.host:'ssh some.host "find /remote/source/dir -type f -name '*.sql' | sort -nr | head -1"' .

Se você mantiver todos os arquivos sql, estes foram transferidos no passado no diretório atual, não há necessidade de escolher os arquivos a serem transferidos seletivamente, porque o rsync fará uma comparação para você e não irá retransferir os arquivos existentes. Então seu comando pode ser simplificado ainda mais para

rsync -avzPe "ssh some.host:'ssh some.host "find /remote/source/dir -type f -name '*.sql'"' .

E por último, você pode usar a regra de filtro do rsync para o seu comando

rsync -avzP some.host:/remote/source/dir/**/*.sql .

Por favor, tenha cuidado ao usar o comando acima, porque a estrutura do subdiretório será removida. Tente executá-lo com --dry-run primeiro. Note também que você não precisa -e ssh blah, porque o single ':' irá automaticamente dizer ao rsync para usar o ssh. Deixe-me saber se isso não satisfaz sua necessidade.

Felicidades!

    
por 25.01.2013 / 14:30
0

Primeiro, você pode simplificar os comandos do SSH adicionando um alias ao seu ~/.ssh/config arquivo.

Host somehost
HostName some.host
User vivek
IdentityFile /where/is/my/id_dsa

Para a carne principal: você precisa executar duas etapas: primeiro, determine qual arquivo copiar (o que deve ser feito no lado remoto) e copie ou atualize o arquivo. Seria mais fácil se você não precisasse se preocupar com quais arquivos são remotos e quais são locais. Então monte o sistema de arquivos remoto com sshfs .

mkdir somehost
sshfs somehost:/ somehost

Agora você pode agir inteiramente em arquivos locais. Você provavelmente deve passar a opção --no-whole-file para rsync , porque caso contrário, assume que um sistema de arquivos local é rápido e sempre copia o arquivo inteiro em vez de aplicar seu algoritmo delta incremental.

rsync -avz --progress --no-whole-file $(find somehost/remote/source/dir -type f -name '*.sql' | sort -nr | head -1) .

Agora, em vez de chamar find , use zsh como seu shell. Como a maioria das chamadas find , a sua pode ser substituída por alguns qualificadores da glob : . para -type f , On para uma classificação numérica e [1] para manter apenas a primeira correspondência.

rsync -avz --progress --no-whole-file somehost/remote/source/dir/**/*.sql(.on[1]) .
    
por 26.01.2013 / 01:02

Tags