web-dev-qa-db-ja.com

フォルダーをリモートシステムにscpし、ディレクトリレイアウトを維持する

何百ものサブフォルダがネストされた大きなディレクトリツリーがあります。 4つのフォルダーとその内容のみをリモートシステムにコピーする必要がありますが、宛先フォルダーの構造を同じに保つ必要があります。

例えば。

./test/sub1/subsub1/hello.txt
./test/sub1/subsub2/hello2.txt    
./test/sub2/hello3.txt

./test/sub1/subsub1/*をuser @ system:〜/ test/sub1/subsub1/*などのターゲットにコピーしたいのですが、subsub2またはsub2をコピーしたくありません。

私は次のようにscpを使用してみました:

scp -r ./test/sub1/subsub1 me@my-system:~/test/sub1/subsub1

結果:scp:/ test/sub1/subsub1:No such file or directory

私も試しました:

scp -r ./test/sub1/subsub1 me@my-system:~/test

これは機能しますが、すべてのファイルを単一のディレクトリにダンプします。/test/sub1/subsub1ディレクトリ構造は維持されません。

フォルダーの構造を維持しながら、フォルダーをコピーするにはどうすればよいですか?

13
Chris

2パスのソリューションが必要です。まず、ターゲットディレクトリがリモートホストに存在することを確認します。

ssh me@my-system 'mkdir -p ~/test/sub1/subsub1' 

その後、ファイルをコピーできます。ディレクトリの同期用に設計されているため、rsyncではなくscpを使用することをお勧めします。使用例:

rsync -r -e ssh ./test/sub1/subsub1/ me@my-system:~/test/sub1/subsub1

-eフラグは、転送の実行に使用するリモートシェルを受け入れます。 スラッシュの末尾はrsyncで非常に重要であるため、上記の例と一致していることを確認してください。

15
conorsch

-R (--relative)オプションをrsyncに使用して、ディレクトリ構造を保持します。を見てみましょう:

https://serverfault.com/questions/39522/how-to-keep-the-full-path-with-rsync

次に例を示します。

[localbox] tree test
test
└── sub1
    └── subsub1
        ├── a
        ├── b
        ├── c
        ├── d
        ├── e
        └── f


 [localbox] rsync -avR test/sub1/subsub1 me@my-system:dest_path
 sending incremental file list
 created directory dest_path
 test/
 test/sub1/
 test/sub1/subsub1/
 test/sub1/subsub1/a
 test/sub1/subsub1/b
 test/sub1/subsub1/c
 test/sub1/subsub1/d
 test/sub1/subsub1/e
 test/sub1/subsub1/f

 sent 406 bytes  received 185 bytes  394.00 bytes/sec
 total size is 0  speedup is 0.00

 [localbox] ssh me@my-system
 [my-system] tree dest_path
 dest_path
 `-- test
    `-- sub1
        `-- subsub1
            |-- a
            |-- b
            |-- c
            |-- d
            |-- e
            `-- f

  3 directories, 6 files

以下は、rsyncのmanページからの抜粋です。

-R、-relative

相対パスを使用します。これは、ファイル名の最後の部分だけではなく、コマンドラインで指定されたフルパス名がサーバーに送信されることを意味します。これは、複数の異なるディレクトリを同時に送信する場合に特に便利です。たとえば、次のコマンドを使用した場合:

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

...これにより、リモートマシンの/ tmp /にbaz.cという名前のファイルが作成されます。代わりに使用した場合

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

次に、/ tmp/foo/bar/baz.cという名前のファイルがリモートマシン上に作成され、フルパスが保持されます。これらの追加のパス要素は「暗黙のディレクトリ」と呼ばれます(つまり、上記の例では「foo」および「foo/bar」ディレクトリ)。

8
frielp