スクリプト内のrsync呼び出しにパラメータ配列をどのように追加しますか?

スクリプト内のrsync呼び出しにパラメータ配列をどのように追加しますか?

いくつかの特定のファイルを除いて、フォルダを別の場所にコピーしたいと思います。

これは私の現在のスクリプトです。

#!/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"

スクリプトを実行すると、次のエラーが発生します。

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]

私は何が間違っていましたか?

答え1

何が起こっているかを確認するには、まずrsyncコマンドをコマンドに変更しますecho

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

潜在的な修正

この行を次のように変更します。

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

答え2

次のように書くと:

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

その後、rsyncすべての変数が二重引用符で拡張されるため、コマンドは単一の文字列を引数として取得します。たとえば、$paramsis --exclude=.git$sourceis /somewhere$destinationisの/elsewhere場合、パラメータは次のようになります。

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

追加の問題があります:"${params[@]}"配列を別々のパラメータに分割することです。前のテキストは${params[@]}最初の配列要素に追加され、次のテキスト${params[@]}は最後の配列要素に追加されます。したがって、rsync4つのパラメータを使用して呼び出します。

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

各パラメータは二重引用符で囲まれた別々の文字列でなければなりません。スペースまたはワイルドカードが含まれている場合、変数の拡張を保護するには二重引用符が必要です。 unwinding を持つ配列の場合、${NAME[@]}"${NAME[@]}"要素を別々の引数に配置します。ワイルドカードとして使用される要素と文字を区切るスペースは、引用符で囲まれていないままにしてください。

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

$sourceこれには、そのような直下のドットファイルは含まれません。以下の同じ名前のファイル/にファイルをコピーするには、ソースディレクトリパスの後にスラッシュを追加するだけです。$source$destination

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

関連情報