Como posso adicionar uma matriz de argumentos dentro da minha chamada rsync dentro de um script?

2

Eu quero copiar uma pasta para outro local, excluindo alguns arquivos específicos

Aqui está meu script atual:

#!/bin/bash

if [ -n "$2" ]
then
    source=$(readlink -f $1)
    destination=$(readlink -f $2)
else
    printf "\nProper syntax: my_copy source_folder destination_folder\n"
        exit
fi


params=(
    --exclude='.git'
    --exclude='deploy'
    --exclude='app/config/database.php'
    --exclude='app/config/config.php'
)


cd $source
rsync " -a ${params[@]} $source/* $destination"

Quando executo meu script, recebo este erro:

rsync: link_stat "-a --exclude=.git" failed: No such file or directory (2)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1070) [sender=3.0.9]

O que estou fazendo de errado?

    
por Loupax 10.09.2013 / 13:20

2 respostas

2

Para ver o que está acontecendo, altere primeiro o comando rsync para um comando echo .

$ echo "rsync \" -a ${params[@]} $source/* $destination\""

Correções potenciais

Eu mudaria essa linha para isso:

$ rsync -a "${params[@]}" "$source/"* "$destination"
    
por 10.09.2013 / 13:31
0

Se você tivesse escrito isso:

rsync " -a $params $source/* $destination"

então o comando rsync estaria obtendo uma única string como seu argumento, porque todas as variáveis são expandidas entre aspas duplas. Por exemplo, se $params for --exclude=.git , $source for /somewhere e $destination for /elsewhere , o argumento será

 -a --exclude=.git /somewhere/* /elsewhere

Há um enrugamento adicional: "${params[@]}" divide o array em parâmetros separados. O texto antes de ${params[@]} é anexado ao primeiro elemento da matriz e o texto após ${params[@]} é anexado ao último elemento da matriz. Então, rsync é chamado com quatro parâmetros:

 -a --exclude=.git
--exclude=deploy
--exclude=app/config/database.php
--exclude=app/config/config.php /somewhere/* /elsewhere

Cada parâmetro deve ser uma string separada entre aspas duplas. Você precisa das aspas duplas para proteger a expansão das variáveis, caso elas contenham espaços em branco ou caracteres curinga. Para a matriz expandida com ${NAME[@]} , "${NAME[@]}" coloca cada elemento em um parâmetro separado. Os espaços que separam os elementos e os caracteres que devem funcionar como curingas devem permanecer sem aspas.

rsync -a "${params[@]}" -- "$source"/* "$destination"

Isso exclui os arquivos de ponto diretamente sob $source , por causa do / . Para copiar arquivos em $source para arquivos com o mesmo nome em $destination , basta colocar uma barra após o caminho para o diretório de origem.

rsync -a "${params[@]}" -- "$source/" "$destination"
    
por 11.09.2013 / 03:23