如果目录不存在,scp可以创建吗?

如果目录不存在,scp可以创建吗?

我想用来scp上传文件,但有时目标目录可能不存在。

可以自动创建文件夹吗?如果是这样,怎么办?如果没有,我可以尝试什么替代方法?

答案1

这是众多事情之一rsync可以做。

rsync如果您使用的是过去几年发布的版本,则它的基本命令语法类似于scp:²

$ rsync -r local-dir remote-machine:path

这会将local-source其内容复制到$HOME/path/local-dir远程计算机上,创建所需的任何目录。

rsync这里确实有一些限制,可能会影响这是否适用于您的特定情况。例如,它不会创建多个级别的丢失远程目录;它只会在遥控器上创建最多一个缺失级别。您可以通过在rsync命令前面添加如下内容来轻松解决此问题:

$ ssh remote-host 'mkdir -p foo/bar/qux'

$HOME/foo/bar/qux如果树不存在,这将创建它。它不会抱怨或做任何其他坏事,如果已经存在。

rsync有时还有其他令人惊讶的行为。基本上,您要求它弄清楚您要复制的内容,而它的猜测可能与您的假设不符。尝试一下看看。如果它的行为不符合您的预期并且您不明白原因,请发布有关本地和远程目录设置的更多详细信息,并给出您尝试过的命令。


脚注:

  1. rsync2.6.0(2004 年 1 月 1 日)之前,它需要该-e ssh标志才能使其表现得像,scp因为它默认为过时的RSH协议

  2. scprsync共享一些标志,但只有一点重叠。

  3. 当用作SSH传输协议时,rsync使用相同的默认值。因此,就像 一样scp,默认情况下它会假设远程计算机上有一个与本地用户同名的用户。

答案2

如果您要复制一组文件,则不然。如果您要复制一个目录及其下面的所有内容,是的。给出这个命令:

$ scp -pr /source/directory user@host:the/target/directory

如果ondirectory中不存在,则会创建它。但是,如果不存在,您可能会遇到问题 - 我不记得这种情况的确切结果,但要为预期的失败做好准备。~/the/targethost~the/targetscp

答案3

据我所知,scp它本身做不到这一点,不。但是,您可以只ssh在目标计算机上创建目录,然后进行复制。就像是:

ssh user@host "mkdir -p /target/path/" &&
    scp /path/to/source user@host:/target/path/

请注意,如果您要复制整个目录,则不需要上述内容。例如,要将目录复制~/foo到远程主机,您可以使用-r(递归)标志:

scp -r ~/foo/ user@host:~/

~/foo这将在远程主机上创建目标目录。但是,它无法创建父目录。scp ~/foo user@host:~/bar/foo除非目标目录bar存在,否则将会失败。无论如何,-r如果您要复制单个文件,该标志将无助于创建目标目录。

答案4

是的你可以。根据 scp 的手册页:

男人scp

……

-r 递归复制整个目录。请注意,scp 遵循树遍历中遇到的符号链接。

....

相关内容