我想用来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
有时还有其他令人惊讶的行为。基本上,您要求它弄清楚您要复制的内容,而它的猜测可能与您的假设不符。尝试一下看看。如果它的行为不符合您的预期并且您不明白原因,请发布有关本地和远程目录设置的更多详细信息,并给出您尝试过的命令。
脚注:
在
rsync
2.6.0(2004 年 1 月 1 日)之前,它需要该-e ssh
标志才能使其表现得像,scp
因为它默认为过时的RSH协议。scp
并rsync
共享一些标志,但只有一点重叠。当用作
SSH
传输协议时,rsync
使用相同的默认值。因此,就像 一样scp
,默认情况下它会假设远程计算机上有一个与本地用户同名的用户。
答案2
如果您要复制一组文件,则不然。如果您要复制一个目录及其下面的所有内容,是的。给出这个命令:
$ scp -pr /source/directory user@host:the/target/directory
如果ondirectory
中不存在,则会创建它。但是,如果不存在,您可能会遇到问题 - 我不记得这种情况的确切结果,但要为预期的失败做好准备。~/the/target
host
~the/target
scp
答案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 遵循树遍历中遇到的符号链接。
....