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


20

我必须将许多文件从一台PC传输到另一台(都是Linux)。我想使用scp它,但是一次scp只允许传输一个文件。

我怎样才能做到这一点?

我有

  • 无法使用rsync或任何其他协议
  • 无法使用无密码短语的证书(但必须具有带密码短语的证书)
  • 要传输的文件的列表以及其他服务器上文件的目标路径的列表
  • 文件分布在很多目录中,而不是我要复制的目录中的所有文件

如果可能的话,我想透明地gzip和ungzip以节省带宽!

这可能吗?

Answers:


31

用途tar

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

2
这是文件格式:“在c模式下,tar将从文件名中读取要存档的名称。特殊名称-C'' on a line by itself will cause the current directory to be changed to the directory specified on the following line. Names are terminated by newlines unless --null is specified. Note that --null also disables the special handling of lines containing -C”。
沙2010年

14

我想为此使用scp,但是scp只允许一次传输一个文件。

我敢肯定这是不对的,至少对于scp大多数Linux发行版中包含的OpenSSH提供的命令而言,这不是事实。

scp file1 file2 ... fileN user@host:/destination/directory/经常使用。

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


这是正确的答案,但实际上一次只能传输一个文件。但是,它将充分利用可用带宽,并应尽快运行。
本杰明·班尼尔

4

不行scp -r yourdir otherhost:/otherdir

然后尝试以下方法:

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

ztar 的-flag进行压缩。或者您可以使用-C ssh:

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

怎么-C办?
内森·费尔曼

1
问题是,我有文件列表。这些文件被分散在很多的目录,而不是所有在目录中的文件,我想复制
彼得·斯米特

2
@Nathan:-C是让ssh进行压缩。
吉米·赫德曼

1

在RHEL5上,这是我知道的唯一方法来安全复制包含特殊字符(如空格)的文件列表。制作一个shell脚本并包括以下内容:

FILE="/path/filename"
while read line; do
scp "$line" username@servername:/destination/
done < $FILE

0

可以解决很多麻烦。

我只是创建了一个文件列表,每个文件旁边都有主机名,而scp似乎可以很好地解析它。即。

srchost=`hostname`
myfiles="${srchost}:~/.bashrc ${srchost}:~/.bash_profile ${srchost}:~/.vimrc ${srchost}:~/.viminfo ${srchost}:~/.toprc ${srchost}:~/.dir_colors"
scp -v $myfiles $HOME

Scp似乎可以使用这种语法正常工作。当我尝试在每个文件旁边都没有主机名的情况下,它在第一个文件之后失败了。我似乎想起了以前用于此的另一种语法,一旦找到它便将其发布。


这可行,但速度很慢-似乎为每个文件启动连接...(我来这里是为了寻找慢速复制的解决方案...) ~/大多数情况下可以忽略-SCP相对于主目录进行操作。 ..如果您在以下位置有其他列表$list:(scp $(echo "$list"|sed "s/^/$srchost:/") local_destination这会破坏带有空格的文件名)
Gert van den Berg

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.