我有一个包含数百个嵌套子文件夹的大型目录树。我只需要将4个文件夹及其内容复制到远程系统,但我需要将目标文件夹结构保持不变。
E.G。
./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:没有这样的文件或目录
我也尝试过:
scp -r ./test/sub1/subsub1 me@my-system:~/test
这样可行,但会将所有文件转储到一个目录中。不维护/ test / sub1 / subsub1目录结构。
如何复制文件夹,同时保持其结构?
答案 0 :(得分:14)
您需要一个双程解决方案。首先,确保远程主机上存在目标目录:
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
标志接受用于执行传输的远程shell。 使用rsync
的结尾斜杠非常重要,因此请确保您的符号与上面的示例相符。
答案 1 :(得分:8)
使用rs -R (--relative)
选项保留目录结构。看看:
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手册页:
-R, - 相对
使用相对路径。这意味着在命令行上指定的完整路径名称将发送到服务器而不仅仅是 文件名的最后部分。这对你来说特别有用 想要同时发送几个不同的目录。对于 例如,如果您使用此命令:
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”目录。)