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


20

1つのPCから別のPCに大量のファイルを転送する必要があります(両方ともLinux)。scpそのために使用したいのscpですが、一度に転送できるファイルは1つだけです。

これどうやってするの?

私が持っています

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

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

これは可能ですか?

回答:


31

使用tar

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

2
ファイル形式は次のとおりです。「cモードでは、tarはfilenameからアーカイブされる名前を読み取ります。特別な名前-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 ''。」
しゃ

14

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

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

私はscp file1 file2 ... fileN user@host:/destination/directory/かなり頻繁に使用します。

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


これは正しい答えですが、実際には一度に1つのファイルしか転送しません。それにもかかわらず、利用可能な帯域幅を最大限に活用し、可能な限り高速に実行する必要があります。
ベンジャミンバニエ

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では、特殊な文字(スペースなど)を含むファイルのリストを安全にコピーするために知っている唯一の方法がここにあります。シェルスクリプトを作成し、次を含めます。

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はホームディレクトリに対して動作します。 ..あなたが他の場所でのリストがある場合$listscp $(echo "$list"|sed "s/^/$srchost:/") local_destination(これは、スペースを含むファイル名かのために中断しますが)
ゲルトファンデンベルグ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.