web-dev-qa-db-ja.com

scpを使用してファイルの.txtファイルリストを転送する

サーバー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を与えます

4
Morgan Delaney

テキストファイルがすでに作成されている場合は、次のようにします

cat /location/file.txt | xargs -i scp {} user@server:/location

これにより、file.txtの出力が1行ずつ移動し、1行ごとにscpコマンドが実行されます。これがお役に立てば幸いです。

8
henry Stark

提供された答えはうまくいきます。 xargs -aを使用してファイルを標準出力に送信しました。次に、それをcat /location/file.txt | xargs -i scp {} user@server:/locationの元の回答と組み合わせました。

私の答え:

xargs -a /location/file.txt | xargs -i scp {} user@server:/location
1
Phil V.

上記の回答では、転送されるすべてのファイルに対して認証する必要があります。 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圧縮を有効にすることができます。

1
deAtog

代わりにrsyncを検討してください。これには、sshサポートが組み込まれており、 --files-fromを使用したファイルのリストからの読み取り がサポートされています。

例:

rsync -av --progress --partial-dir=/tmp --files-from=file_list.txt . [email protected]:/dest

Scpに対する利点:

参照:

0
qwr

フォルダのリストについても同じことをしたかったのですが、xargsを使用した回答はどれもうまくいきませんでした。結局、私はこれを簡単に解決しました:

scp -r user@server:/location/{"$(cat folder_list.txt | tr '\n' ',' | sed 's/,$//')"} .

ファイルのリストをシェル拡張に渡すところ。これは、別の解決策を探している人には役立つかもしれないと思います。

0
Martin