rsync ファイルのソースとディレクトリ構造

rsync ファイルのソースとディレクトリ構造

私はシェルの文字列リストを使用してrsyncコマンドを手動で作成し、いくつかのファイルとフォルダをコピーしてきました。

リモートファイル構造の場合、たとえば次のようになります。

/home/foo/
  media/
    bigfile.bin
  somedir/
    a.txt
    b.json

私は次のように書くでしょう:

rsync -Pavz my_remote:/home/foo/{media/bigfile.bin,somedir} .

結果のローカルファイル構造は次のとおりです。

./bigfile.bin
./somedir/
  a.txt
  b.json

ディレクトリ構造が重要です。 bigfile.binmedia/ローカルディレクトリにはありませんが、再帰的somedirにコピーされました。これが私が望むものです。

これで、転送するファイルのリストを作成して使用できるスクリプトが作成されました。

rsync -Pavz --files-from=list.txt my_remote:/home/foo

list.txtどこ

media/bigfile.bin
somedir/

これで、結果のローカルファイル構造は次のようになります。

./media/
  bigfile.bin
./somedir/
  a.txt
  b.json

mediaこれで不要なディレクトリができました。共通のベースディレクトリがあるためですmy_remote:/home/foo。使用時に以前の動作を復元する方法はありますか--files-from?オンにすると--no-Rすべてが順調に進みますが、実際にはまだ欲しいですsomedir/。より一般的に望む動作は、「指定されたパス(bigfile.bin、、)の基本部分を取得し、ターゲットパス()の親ディレクトリをsomedir無視し、そのパスとその内容を繰り返しコピーすること」です。media

スクリプトを使用して元のようにシェルから拡張されるように中括弧を使用してrsyncコマンドを作成することもできますが、おそらくリモートファイル名で文字エスケープの問題を処理する必要があるためです--files-from

答え1

あなたが探しているものは次のとおりです(rsyncバージョン=> 2.6.7)。

含めたくないパスの末尾にlist.txt点スラッシュを追加します。./

media/./bigfile.bin
somedir/

この場合、./その行のパスは無視されますrsyncmedia/media/./bigfile.bin

マニュアルページから

--relative, -R
        ...

        It  is  also  possible  to limit the amount of path information that is
        sent as implied directories for each path you specify.  With  a  modern
        rsync  on the sending side (beginning with 2.6.7), you can insert a dot
        and a slash into the source path, like this:

            rsync -avR /foo/./bar/baz.c remote:/tmp/

私はテストしたばかりで、私が理解したように動作するようです。

関連情報