2017-01-05 7 views
0

にファイルをコピーします上記のようにのように:再帰的にrsyncは/私は与えられたファイル構造を有する異なる構造

- public/ 
    - examplesite.com/ 
    - file.css 
    - file.jpg 
    - anotherexamplesite.com/ 
    - stuff.css 
    - things.jpg 

やサイトへのresourcesディレクトリ内のファイルのようにそうフォルダ:

- sites/ 
    - examplesite.com/ 
     - resources/ 
      - views/ 
      - view.php 

各サイトのパブリックディレクトリの内容を基本的に1つのディレクトリにコピーし、その親ディレクトリをpublicディレクトリと同期させます。リソースディレクトリをsitesディレクトリに直接コピーします。私は、この第2の部分の作業を持っているが、最初の部分は正しく動作しません。

#!/usr/bin/env bash 
MY_PATH="/var/www" 

rsync --exclude='.git/' "$MY_PATH/dev/" "$MY_PATH/sites/" --recursive 
rsync --exclude='.git/' --exclude='resources/' "$MY_PATH/dev/public" "$MY_PATH/public/" --recursive 

このスクリプトの最初のrsyncコマンドが正常に動作し、それをコピーファイルに:

これは私が持っているものですフォルダ構造を変更する必要がないため、サイトディレクトリに問題はありません。しかし、第2のrsyncコマンドは、次のん:

- public/ 
    - examplesite.com/ 
    - public/ 
     - file.css 
     - file.jpg 
    - anotherexamplesite.com/ 
    - public/ 
     - stuff.css 
     - things.jpg 

私も彼らのパブリックディレクトリのうち、先のファイルを移動しながら、簡単に、再帰的に適切なサイトフォルダにファイルをコピーする方法が本当にわからない、とまで1つのディレクトリに格納されているため、サイト名の下に直接存在します。

アイデア?

+0

私はあなたがrsyncだけでこれを行うことはできないと確信しています。 '--filter'でさえ、このような翻訳を扱えるほどスマートではありません。あなたのベスト・ベットは、[@ sapanoia](http://stackoverflow.com/a/41496391/1072112)が示唆しているハイブリッド・ソリューションである可能性が高いです。実際の設定管理ツールをサイトの展開に使用することを検討したいと思うかもしれません - [ansible](https://www.ansible.com/)や[saltstack](https://saltstack.com/)や[chef ](https://www.chef.io/)などである。 – ghoti

答えて

2

あなたが(ちょうどあなたのアイデアを与えるために、テストされていない)例えば、rsyncでいくつかのbashコードを混在させることができます:

for site in $MY_PATH/dev/*; do 
    dist="$MY_PATH/public/$(basename "$site")" 
    mkdir -p "$dist" 
    rsync -r --exclude='.git/' "$site/public/" "$dist/" 
done 

をこれは以下となります。dev/ のサイト経由

  • 反復
  • 宛先を決めて変数に格納するdist
  • 宛先ディレクトリにdev/から
  • rsyncの存在resourcesためのあなたの例では、すでに働いているので、public/

にこのスニペットだけdevを処理します。

rsyncには、もはや存在しない宛先からファイルを削除したい場合は、フラグ--deleteを追加することができます。

+0

私はrsync '--list-onlyを使ってこのようなことを提案しようとしていました。これははるかに明確かつ簡潔です。 :-)あなたの '--exclude'を' --cvs-exclude'に置き換えることができます。これは、 '.git'と宣伝にはおそらく不適切な他のものを網羅しています。ああ、シェルがパラメータ拡張をサポートしているときに 'basename'と' dirname'を使う必要はほとんどありません。 – ghoti

+0

これはすばらしい、ありがとう! –

関連する問題