web-dev-qa-db-ja.com

あるサーバーから別のサーバーに数百万のファイルを転送する

2台のサーバーがあります。それらの1つには、1500万のテキストファイル(約40 GB)があります。それらを別のサーバーに転送しようとしています。それらを圧縮してアーカイブを転送することを検討しましたが、これは良い考えではないことに気付きました。

そこで、次のコマンドを使用しました。

scp -r usrname@ip-address:/var/www/html/txt /var/www/html/txt

しかし、このコマンドは約50,000ファイルを転送するだけで、接続が失われることに気付きました。

ファイルのコレクション全体を転送できるより良いソリューションはありますか?接続が失われたときに転送されなかったファイルを転送するには、rsyncのようなものを使用することを意味します。別の接続の割り込みが発生した場合は、コマンドを再度入力してファイルを転送し、既に正常に転送されたファイルは無視します。

これは、常に最初のファイルから始まるため、scpでは不可能です。

15
yuli chika

あなたが言うように、rsyncを使用してください:

rsync -azP /var/www/html/txt/ username@ip-address:/var/www/html/txt

オプションは次のとおりです。

-a : enables archive mode, which preserves symbolic links and works recursively
-z : compress the data transfer to minimise network usage
-P : to display a progress bar and enables you to resume partial transfers

@aimが答えで述べているように、末尾に/ソースディレクトリ(両方とも問題ありません)。

詳細は man page から

33
garethTheRed

Sshではなくrsyncを使用してください!

rsync -av username@ip:/var/www/html/txt /var/www/html/

Manページから:

-a、-archive:これは-rlptgoDと同等です。これは、再帰が必要で、ほとんどすべてを保持したいという簡単な方法です(-Hは重要な省略です)。上記の同等の唯一の例外は、-files-fromが指定されている場合です。その場合、-rは暗黙指定されません。

-v、-verbose:このオプションは、転送中に提供される情報の量を増やします。デフォルトでは、rsyncはサイレントで動作します。 -vを1つ指定すると、転送されているファイルに関する情報と、最後に簡単な概要が表示されます。 2つの-vオプションを使用すると、スキップされるファイルに関する情報と、最後に少し多くの情報が表示されます。 2つを超える-vオプションは、rsyncをデバッグする場合にのみ使用してください。

フォルダーの最後にスラッシュを使用した方法に注意してください- 重要 です。

7
aim

Lftpを使用します。これはrsyncよりはるかに高速で、Webサイトのミラーリング(多くの小さなファイル)に最適です。複数の接続を使用して並列に転送することもできます。

lftp -u username,password sftp://ip-address -e 'mirror --only-newer --no-dereference --parallel=5 /remote/path/ /destination/;quit'

1つの接続が切断されると、再接続して続行します。転送を中断すると、既存のファイルがスキップされて続行されます。

http://lftp.yar.ru/

1
Mihajlo

別の方法は、(オプションで圧縮された)tarファイルをsshにパイプすることです。

tar -czf - ./* | ssh other.Host.foo "cd /tmp; tar -xzf-"
0
jmullee