SCP一个文件夹到远程系统保留目录布局



我有一个具有数百个嵌套子折叠器的大目录树。我只需要将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"目录)。

最新更新