如何通过一个命令通过 scp 复制多个文件?

如何通过一个命令通过 scp 复制多个文件?

我需要将大量文件从一台 PC 传输到另一台 PC(两台都是 Linux)。我想使用scp它,但scp每次只能传输一个文件。

我怎样才能做到这一点?

我有

  • 无法使用 rsync 或任何其他协议
  • 无法使用无密码证书(但有带密码的证书)
  • 要传输的文件列表以及另一台服务器上文件的目标路径列表
  • 这些文件分散在很多目录中,并不是我想要复制的目录中的所有文件

如果可能的话,我愿意透明地使用 gzip 和 ungzip 来节省带宽!

这可能吗?

答案1

使用tar

tar cvzf - -T list_of_filenames | ssh hostname tar xzf -

答案2

我想使用 scp 来实现这一点,但是 scp 一次只允许传输一个文件。

我非常确定这不是真的,至少对于scp大多数 Linux 发行版中包含的 OpenSSH 提供的命令来说不是这样的。

我使用得scp file1 file2 ... fileN user@host:/destination/directory/相当频繁。

对于透明压缩,SSH 协议已内置此功能,如果您在命令行中scp提供选项,则可以使用它。对于许多类似的小文件,您会发现 akira 建议的 tar+gz 选项可以获得更好的压缩效果,因为它可以利用这些文件之间的相似性,将每个文件压缩为单独的实体。不过,我通常更喜欢使用 scp,因为它更容易恢复部分传输(或者,虽然我知道在这种情况下提问者没有这个选项),因为它不仅更容易恢复,而且共享 tar+gz 选项的全流压缩优势。-Cscprsync

答案3

不起作用scp -r yourdir otherhost:/otherdir

那么尝试一下这个:

tar cfz - . | ssh otherhost "cd /mydir; tar xvzf -"

tar 的-flagz可以进行压缩。或者,您也可以使用 ssh 的 -C:

tar cf - . | ssh -C otherhost "cd /mydir; tar xvf -"

答案4

scp您实际上可以使用以下协议提供文件列表,

scp <user>@<host>:{<file1>,<file2>,...,<fileN>} <destination>

请注意,文件列表用法语括号括起来。

奖励:如果你想从相同的目录、使用、

scp <user>@<host>:<source>{<file1>,<file2>,...,<fileN>} <destination>

相关内容