複数のソースとターゲットをrsync

複数のソースとターゲットをrsync

以下は期待どおりに機能します。

rsync --delete-after -uavh --progress /home/usr/test1/cool-beans /home/usr/test2/
rsync --delete-after -uavh --progress /home/usr/test1/pineapple /home/usr/test2/
rsync --delete-after -uavh --progress /home/usr/test1/pizza /home/usr/test2/
rsync --delete-after -uavh --progress /home/usr/test1/dragons /home/usr/test2/elephant/

しかし、単純化すると、次のようになります。

rsync --delete-after -uavh --progress \
    /home/usr/test1/cool-beans /home/usr/test2/ \
    /home/usr/test1/pineapple /home/usr/test2/ \
    /home/usr/test1/pizza /home/usr/test2/ \
    /home/usr/test1/dragons /home/usr/test2/elephant/ 

エラーが発生します。必要に応じて、「dragons」フォルダを「elephant」に入れる代わりに、「cool-beans」、「pineapple」、「pizza」、および「dragons」をすべて「elephant」に入れることは望ましくありません。同じ出力を得ながら、どのように単純化された方法で(最初の例を重複せずに)作成できますか?ありがとうございます!

ベストアンサー1

rsync単一のコマンドに複数のターゲットを含めることはできません。 「単純化された」バージョンを試すと、最後のパスを除くすべてのパスがコピーされたデータのソースと見なされるため、それ自体cool-beansからpineappleコピー(複製)するわけではありません。このオプションは、初めて何かを試すときに非常に便利です。pizzadragonstest2--dry-run

通話を2回に減らすことができます。次のいずれかを完了してください。

rsync --delete-after -uavh --progress /home/usr/test1/cool-beans /home/usr/test1/pineapple /home/usr/test1/pizza /home/usr/test2/
rsync --delete-after -uavh --progress /home/usr/test1/dragons /home/usr/test2/elephant/

または、関数を使用して共通要素をカプセル化します。

myRsync1() {
    rsync --delete-after -uavh --progress "$@"
}

myRsync1 /home/usr/test1/cool-beans /home/usr/test1/pineapple /home/usr/test1/pizza /home/usr/test2/
myRsync1 /home/usr/test1/dragons /home/usr/test2/elephant/

ほとんどのパスが固定コンポーネントで始まることを保証できる場合は、パブリックパス(すでに存在する必要があります)を最初の引数として提供して、関数呼び出しの視覚的な使用をさらに簡素化できます。

myRsync2() (
    cd -- "$1" || return 1
    shift
    rsync --delete-after -uavh --progress "$@"
)

それから電話してください。

myRsync2 /home/usr/test1 cool-beans pineapple pizza /home/usr/test2/
myRsync2 /home/usr/test1/dragons /home/usr/test2/elephant

または:

myRsync2 /home/usr test1/cool-beans test1/pineapple test1/pizza test2/
myRsync2 /home/usr test1/dragons test2/elephant

おすすめ記事