何百ものサブフォルダがネストされた大きなディレクトリツリーがあります。 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ディレクトリ構造は維持されません。
フォルダーの構造を維持しながら、フォルダーをコピーするにはどうすればよいですか?
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
で非常に重要であるため、上記の例と一致していることを確認してください。
-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」ディレクトリ)。