rsyncスクリプトを実行しており、特定のフォルダを除外したいと思います。 rsyncを使用するとファイルを作成し、そこにすべての除外項目を追加する必要があることを知っていますが、.txt
私が望むすべての除外項目を含むスクリプトにグローバル文字列を含めてから、そのグローバル文字列をrsyncコマンドに追加できるかどうか疑問に思います。
グローバル文字列の例
ROOT_EXCLUDE="--exclude=/dev --exclude=/proc --exclude=/sys --exclude=/temp --exclude=/run --exlucde=/mnt --exlcude=/media
再同期コマンド
rsync -au --exclude 'ROOT_EXCLUDE' /Users/Me/Home /Users/me/Backup
答え1
除外リストの要素にスペースまたはワイルドカードが含まれていない場合は、変数を定義してROOT_EXCLUDE
それを使用できます(引用符を除く)。引用符のない変数拡張は、各空白シーケンス内の変数値を分割し、各要素にワイルドカード文字が含まれている場合はワイルドカードパターンに展開されます。
ROOT_EXCLUDE="--exclude=/dev --exclude=/proc --exclude=/sys --exclude=/temp --exclude=/run --exclude=/mnt --exclude=/media"
rsync -au $ROOT_EXCLUDE /Users/Me/Home /Users/me/Backup
除外リストにワイルドカードを使用する場合は、パターンと一致する名前のファイルがない限り、標準シェルで機能します。こういう言葉で作るには難しい仮定--exclude=*.bak
であり、書いてみると通常はそうではありません--exclude *.bak
。このようなトラップを回避するには、ワイルドカード拡張をオフにします。
ROOT_EXCLUDE="--exclude=/dev --exclude=*.bak"
set -f
rsync -au $ROOT_EXCLUDE /Users/Me/Home /Users/me/Backup
set +f
配列をサポートするシェル(ksh、bash、zsh、通常のshではない)では、引数リストを次の場所に配置できます。大量に。これはパラメータリストを変数に埋めるのに推奨される方法です。
#!/bin/bash
…
ROOT_EXCLUDE=('--exclude=/dev' '--exclude=*.bak')
rsync -au "${ROOT_EXCLUDE[@]}" /Users/Me/Home /Users/me/Backup
通常のsh(すべてのBourne / POSIXシェル、たとえば、sh
または)には、次のように設定できるdash
名前付き配列(位置引数$1
、、$2
...)があります。set -- …
位置パラメータを一時的に変更する必要がある場合は、関数から一時的に変更してください。各関数呼び出しには一意の位置パラメータセットがあります。
set -- '--exclude=/dev' '--exclude=*.bak'
rsync -au "$@" /Users/Me/Home /Users/me/Backup
-x
除外するディレクトリのリストを作成する代わりに、マウントポイントをスキップするオプションを渡す必要があります。などを処理します/proc
。/sys
ただし、複数のパーティションにわたってファイルをバックアップするには、すべてのソースを明示的に含める必要があります。ホームディレクトリをバックアップする場合は、スキップするメモリ内ファイルシステムがない可能性がありますが、ネットワークファイルシステムやその他のFUSEファイルシステムがある可能性があります。
rsync -ax /Users/Me/Home /Users/me/Backup
1もっと一般的にはIFS
。