我有一个具有数百个嵌套子折叠器的大目录树。我只需要将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:没有这样的文件或目录
我也尝试了:
scp -r ./test/sub1/subsub1 me@my-system:~/test
这有效,但将所有文件转储到一个单一目录中。/test/sub1/subsub1目录结构不保持。
如何在维护其结构的同时复制文件夹?
您需要两个通用解决方案。首先,确保远程主机上存在目标目录:
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-to-to-te-the-plull-path-path-with-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, - 层次
使用相对路径。这意味着命令行上指定的完整路径名已发送到服务器,而不是仅仅 文件名的最后部分。这特别有用时 想要同时发送几个不同的目录。为了 例如,如果您使用此命令:
rsync -av /foo/bar/baz.c remote:/tmp/
...这将在远程计算机上创建一个名为BAZ.C的文件。相反,您使用
rsync -avR /foo/bar/baz.c remote:/tmp/
然后将在远程计算机上创建一个名为/tmp/foo/bar/baz.c的文件,并保留其完整路径。这些额外的路径 元素称为"隐含目录"(即" foo"和 上述示例中的" foo/bar"目录)。