web-dev-qa-db-ja.com

1つのコマンドでscpを介して複数のファイルをコピーするにはどうすればよいですか?

PC間で多くのファイルを転送する必要があります(両方ともLinux)。 scpを使用したいのですが、scpでは一度に1つのファイルしか転送できません。

これどうやってするの?

私が持っています

  • Rsyncまたはその他のプロトコルを使用する可能性はありません
  • パスフレーズなしの証明書を使用する可能性はありません(ただし、パスフレーズ付きの証明書があります)
  • 転送するファイルのリストと、他のサーバー上のファイルの宛先パスのリスト
  • ファイルが多くのディレクトリに分散していて、コピーしたいディレクトリ内のすべてのファイルではない

可能であれば、帯域幅を節約するために透過的にgzipとungzipを行います!

これは可能ですか?

22
Peter Smit

tar を使用:

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

そのためにscpを使用したいのですが、scpでは一度に1つのファイルしか転送できません。

私はそれが正しくないことを確信しています。少なくとも、ほとんどのLinuxディストリビューションに含まれているOpenSSHによって提供されるscpコマンドについてはそうではありません。

scp file1 file2 ... fileN user@Host:/destination/directory/をかなり頻繁に使用しています。

透過的圧縮の場合、SSHプロトコルにはこれが組み込まれており、コマンドラインで-Cオプションを指定すると、scpがそれを使用できます。同様の小さなファイルがたくさんある場合、scpが各ファイルを個別のエンティティとして圧縮するようなファイル間の類似性を利用できるため、akiraによって提案されたtar + gzオプションがより良い圧縮を得ることがわかります。部分的な転送を再開する方が簡単なので(または、この状況では質問者にオプションがないことを知っていますが)、一般的にscpを使用することを好みますrsync再開と共有がさらに簡単なのでtar + gzオプションのストリーム全体の圧縮の利点。

17
David Spillett

しないscp -r yourdir otherhost:/otherdir仕事?

次にこれを試してください:

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

tarへのz-フラグは圧縮を行います。または、-Cを使用してsshできます。

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

RHEL5では、特殊文字(スペースなど)を含むファイルのリストを安全にコピーするために私が知っている唯一の方法は次のとおりです。シェルスクリプトを作成し、以下を含めます。

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

面倒なことなくできます。

私は単純に、各ファイルの横にホスト名を含むファイルのリストを作成し、scpはそれをうまく解析しているようです。すなわち。

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

Scpはこの構文で正常に動作するようです。各ファイルの横にホスト名なしでそれを試みたので、最初のファイルの後で失敗しました。以前に使用した別の構文を思い出したようで、見つけたら投稿します。

0
Ernie M.