Não é possível copiar vários arquivos usando o rsync versão 3.0.9?

1

Eu estou tentando copiar dois arquivos usando o rsync de um machineB , mas de alguma forma ele sempre copia apenas um arquivo, mas não o segundo arquivo -

Aqui está a sintaxe que estou usando -

rsync -avz david@machineB:'/data/pe_t1_snapshot/20140317/t1_weekly_1680_0_200003_5.data :/data/pe_t1_snapshot/20140317/t1_weekly_1680_1_200003_5.data' /data01/primary

Apenas copia este ficheiro t1_weekly_1680_0_200003_5.data para a pasta /data01/primary e não copiou o segundo ficheiro que é t1_weekly_1680_1_200003_5.data .

Estou usando o Ubuntu 12.04 e a versão do rsync é -

rsync  version 3.0.9  protocol version 30

Este é o erro que estou recebendo -

receiving incremental file list
rsync: change_dir "/home/david/:/data/pe_t1_snapshot/20140317" failed: No such file or directory (2)
t1_weekly_1680_0_200003_5.data

sent 30 bytes  received 504982813 bytes  6196108.50 bytes/sec
total size is 1761988281  speedup is 3.49
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1536) [generator=3.0.9]

Comecei a ler o manual do rsync, mas de alguma forma não consigo entender o que estou fazendo errado?

Atualização: -

Funciona bem em um único comando se eu o executar a partir do console, mas preciso executá-lo a partir do script de shell, então adicionei sua sugestão em meu script de shell.

Eu apenas executei sua sugestão no exemplo abaixo e recebi um erro.

Abaixo está o shell script que simplesmente tenta copiar o arquivo de machineB , se os arquivos não estiverem lá em machineB , então deve estar lá em machineC , então ele tentará copiar de machineC . PRIMARY_PARTITION e SECONDARY_PARTITION terão números de arquivo.

E abaixo do script de shell estou executando em machineA .

#!/usr/bin/env bash

readonly PRIMARY=/data01/primary
readonly FILERS_LOCATION=(machineB machineC)
readonly MEMORY_MAPPED_LOCATION=/bexbat/data/be_t1_snapshot
PRIMARY_PARTITION=(0 548)
SECONDARY_PARTITION=(1101 1374)

dir1=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[0]} \
  ls -dt1 "$MEMORY_MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | 
  head -n1)
dir2=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[1]} \
  ls -dt1 "$MEMORY_MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] |
  head -n1)

echo $dir1
echo $dir2

## Build your list of filenames before the loop. 
for n in "${PRIMARY_PARTITION[@]}"
do
    primary_files="$primary_files :$dir1"/t1_weekly_1680_"$n"_200003_5.data
done

## Repeat for $SECONDARY_PARTITION
for n in "${SECONDARY_PARTITION[@]}"
do
    secondary_files="$secondary_files :$dir2"/t1_weekly_1680_"$n"_200003_5.data
done

echo "Primary: " $primary_files
echo "Secondary: " $secondary_files


if [ "$dir1" = "$dir2" ]
then
    find "$PRIMARY" -mindepth 1 -delete

    # this line is giving an exception somehow
    rsync -avz david@${FILERS_LOCATION[0]}${primary_files} $PRIMARY/
    rsync -avz david@${FILERS_LOCATION[1]}${primary_files} $PRIMARY/

fi

Abaixo está o erro que recebi -

Unexpected remote arg: :/data/pe_t1_snapshot/20140320/t1_weekly_1680_0_200003_5.data
rsync error: syntax or usage error (code 1) at main.c(1232) [sender=3.0.9]
Unexpected remote arg: :/data/pe_t1_snapshot/20140320/t1_weekly_1680_0_200003_5.data
rsync error: syntax or usage error (code 1) at main.c(1232) [sender=3.0.9]
Unexpected remote arg: :/data/pe_t1_snapshot/20140320/t1_weekly_1680_1101_200003_5.data
rsync error: syntax or usage error (code 1) at main.c(1232) [sender=3.0.9]
Unexpected remote arg: :/data/pe_t1_snapshot/20140320/t1_weekly_1680_1101_200003_5.data
rsync error: syntax or usage error (code 1) at main.c(1232) [sender=3.0.9]
    
por arsenal 21.03.2014 / 19:36

1 resposta

4

Pela aparência das coisas, tudo que você precisa fazer é soltar as aspas (quebras de linha adicionadas para maior clareza):

 rsync -avz \
   david@machineB:/data/pe_t1_snapshot/20140317/t1_weekly_1680_0_200003_5.data \
   :/data/pe_t1_snapshot/20140317/t1_weekly_1680_1_200003_5.data \
   /data01/primary

Na página rsync man:

The  syntax  for requesting multiple files from a remote host is done by
specifying additional remote-host args in the same style as the first, or with
the hostname omitted.  For instance, all these work:

          rsync -av host:file1 :file2 host:file{3,4} /dest/

Os dois primeiros arquivos no exemplo copiado usam a mesma sintaxe que você tem, porém eles são argumentos separados (citando-os concatena-os em um único argumento). Se seus caminhos contiverem caracteres que precisam ser citados, você poderá fazer algo como:

rsync -avz \
  'user@host:dodgy path/file_with_asterix*' \
  ':some_other/dodgy\path' \
  /dest

Atualizar

Acho que a maneira mais simples de fazer seu script funcionar é usar matrizes para primary_files e secondary_files . As alterações relevantes para primary_files são:

for n in "${PRIMARY_PARTITION[@]}"
do
  primary_files+=( ":$dir1/t1_weekly_1680_${n}_200003_5.data" )
done

....

echo "Primary: ${primary_files[@]}"

...

rsync -avz "david@${FILERS_LOCATION[0]}${primary_files[@]}" "$PRIMARY/"

O [@] dividirá a matriz em argumentos diferentes, independentemente da citação. Caso contrário, lembre-se de suas citações variáveis, algumas das quais você pode ou não causar problemas.

    
por 21.03.2014 / 19:53