私はシェルの文字列リストを使用して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.bin
media/
ローカルディレクトリにはありませんが、再帰的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/
この場合、./
その行のパスは無視されますrsync
。media/
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/
私はテストしたばかりで、私が理解したように動作するようです。