将文件夹scp到保持目录布局的远程系统

Chr*_*ris 11 linux scp

我有一个包含数百个嵌套子文件夹的大型目录树.我只需要将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"目录).