2010-07-31 47 views
0

我似乎无法说服scp行为。如何脚本scp -r copy?

测试数据

[email protected]:/tmp$ find /tmp/a1/ 
/tmp/a1/ 
/tmp/a1/a2 
/tmp/a1/a2/a3 

在发出命令

[email protected]:/tmp$ scp -r /tmp/a1 domU-12-31-38-00-E2-52.compute-1.internal:/tmp/a1 

我希望在domU的-12-31-38-00-E2-52.compute-创建的目录结构1.internal,无论目录主机上是否存在目录/ tmp/a1。相反,什么SCP实际上创建具有以下结构(如果存在目标主机上的/ tmp/A1)

[email protected]:/tmp$ ssh domU-12-31-38-00-E2-52.compute-1.internal find /tmp/a1 
/tmp/a1 
/tmp/a1/a1 
/tmp/a1/a1/a2 
/tmp/a1/a1/a2/a3 

如何SCP被迫复制到指定目录作为操作的根源在哪里?

稍后,我想对此操作进行脚本编写,以便主设备上给定的目录路径可以调用将同一目录结构复制到所有从设备的脚本。请注意,rsync行为(至少从我测试过的)在这种情况下是相同的。

谢谢, Maxim。

回答

2

scp模仿cp的行为,即复制INTO目标目录(如果存在)。请将其复制到/tmp而不是/tmp/a1

+0

我不认为它会在所有情况下作为一般复制到奴隶实用程序的工作。你的建议意味着我需要找到一个参数的绝对路径,然后决定它是否是一个目录。如果它是在构建scp命令之前剥去一层。没有更简单的解决方案,“脚本更友好吗?” – 2010-07-31 19:41:16

+0

您也可以将文件剥去一层。我认为这不需要有条件。 'dirname'会为你做到这一点。您需要小心路径尽头的斜杠。 – 2010-08-01 00:48:03

0

而不是使用 $ scp -r /tmp/a1 使用这样的: $ scp -r /tmp/a1/* ,将每个文件复制在/ tmp/A1,所以你得到的目的地的结构将 的/ tmp/A1/A2/A3 否则,我会建议将目标目录简单地设置为“/ tmp /”,而不是“/ tmp/a1 /”,无论哪种方式都可以。关于rsync,不,它是不一样的:**this/**到rsync意味着**this/**根据scpcp。尾斜杠[this/]表示复制文件夹的内容。如果将尾部斜杠关闭,它将复制目录本身[如果递归]。

希望你发现这个有用。 :) 马特