サーバーAには160万のファイルがあり、サーバーBに到達する必要があるのはそのうちの約2万です。宛先であるサーバーBはGoDaddy共有ホスティング上にあるため、一度に多数のファイルを転送するためのscpに制限されています。
SQLクエリからこれらの20k以上のファイルの.txtファイルを生成し、そのリストをscpにフィードしたいと思います。そうするためのオプションはありますか?
_cat /proc/version
_は私にLinux version 2.6.32-531.23.3.lve1.2.65.el6.x86_64 ([email protected]) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Tue Aug 19 10:37:27 EDT 2014
を与えます
テキストファイルがすでに作成されている場合は、次のようにします
cat /location/file.txt | xargs -i scp {} user@server:/location
これにより、file.txtの出力が1行ずつ移動し、1行ごとにscpコマンドが実行されます。これがお役に立てば幸いです。
提供された答えはうまくいきます。 xargs -a
を使用してファイルを標準出力に送信しました。次に、それをcat /location/file.txt | xargs -i scp {} user@server:/location
の元の回答と組み合わせました。
私の答え:
xargs -a /location/file.txt | xargs -i scp {} user@server:/location
上記の回答では、転送されるすべてのファイルに対して認証する必要があります。 SCPはSSH上で実行され、GoDaddyはtarなどのSSHを介した他のコマンドへのアクセスを提供します。そのため、最良の方法は、次の方法でsshでtarを使用することです。
tar -T <file> -cf - | ssh <user>@<Host> "tar -C <dir> -xvf -"
ファイルのリストがSTDINにある場合は、代わりに次の操作を実行できます。注:ここでは、STDINの生成にのみcatが使用されます。
cat <file> | tar -T - -cf - | ssh <user>@<Host> "tar -C <dir> -xvf -"
追加の処理時間を犠牲にして転送時間を短縮するために、両方のtarコマンドに-zまたは-jを追加して、それぞれgzipまたはbzip圧縮を有効にすることができます。
代わりにrsyncを検討してください。これには、sshサポートが組み込まれており、 --files-from
を使用したファイルのリストからの読み取り がサポートされています。
例:
rsync -av --progress --partial-dir=/tmp --files-from=file_list.txt . [email protected]:/dest
Scpに対する利点:
scp
はrsync
とどう違うのですか?参照:
フォルダのリストについても同じことをしたかったのですが、xargs
を使用した回答はどれもうまくいきませんでした。結局、私はこれを簡単に解決しました:
scp -r user@server:/location/{"$(cat folder_list.txt | tr '\n' ',' | sed 's/,$//')"} .
ファイルのリストをシェル拡張に渡すところ。これは、別の解決策を探している人には役立つかもしれないと思います。