我有一个包含数百个嵌套子文件夹的大型目录树.我只需要将4个文件夹及其内容复制到远程系统,但我需要将目标文件夹结构保持不变.
例如
./test/sub1/subsub1/hello.txt
./test/sub1/subsub2/hello2.txt
./test/sub2/hello3.txt
Run Code Online (Sandbox Code Playgroud)
我想将./test/sub1/subsub1/*复制到目标,例如user @ system:〜/ test/sub1/subsub1/*但我不想复制subsub2或sub2.
我尝试过如下使用scp:
scp -r ./test/sub1/subsub1 me@my-system:~/test/sub1/subsub1
Run Code Online (Sandbox Code Playgroud)
结果:scp:/ test/sub1/subsub1:没有这样的文件或目录
我也尝试过:
scp -r ./test/sub1/subsub1 me@my-system:~/test
Run Code Online (Sandbox Code Playgroud)
这可以工作,但会将所有文件转储到一个目录中.不维护/ test/sub1/subsub1目录结构.
如何复制文件夹,同时保持其结构?
con*_*sch 15
您需要一个双程解决方案.首先,确保远程主机上存在目标目录:
ssh me@my-system 'mkdir -p ~/test/sub1/subsub1'
Run Code Online (Sandbox Code Playgroud)
然后,您可以复制您的文件.我推荐使用rsync而不是scp,因为它是为同步目录而设计的.用法示例:
rsync -r -e ssh ./test/sub1/subsub1/ me@my-system:~/test/sub1/subsub1
Run Code Online (Sandbox Code Playgroud)
该-e标志接受用于执行传输的远程shell.尾随斜杠非常重要rsync,因此请确保您的斜杠符合上述示例.
小智 8
使用-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
Run Code Online (Sandbox Code Playgroud)
以下是从rsync手册页中删除的:
-R, - 相对
使用相对路径.这意味着在命令行上指定的完整路径名称将发送到服务器,而不仅仅是文件名的最后部分.当您想要同时发送多个不同的目录时,这尤其有用.例如,如果您使用此命令:
rsync -av /foo/bar/baz.c remote:/tmp/
Run Code Online (Sandbox Code Playgroud)
...这将在远程机器上的/ tmp /中创建一个名为baz.c的文件.如果你使用了
rsync -avR /foo/bar/baz.c remote:/tmp/
Run Code Online (Sandbox Code Playgroud)
然后在远程机器上创建一个名为/tmp/foo/bar/baz.c的文件,保留其完整路径.这些额外的路径元素称为"隐含目录"(即上例中的"foo"和"foo/bar"目录).