我在服务器 A 上有 160 万个文件,其中只有大约 2 万个需要传输到服务器 B。目标服务器 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
答案1
如果你已经创建了文本文件,请执行以下操作
cat /location/file.txt | xargs -i scp {} user@server:/location
这将逐行执行 file.txt 的输出并每行运行 scp 命令;我希望这会有所帮助。
答案2
考虑同步作为替代方案,它内置了 ssh 支持,并支持使用以下方法读取文件列表--files-from
。
例子:
rsync -av --progress --partial-dir=/tmp --files-from=file_list.txt . [email protected]:/dest
相对于 scp 的优势:
- 避免 cat/xargs 和命令行长度限制,因此只需输入一次密码
- 被打断后恢复进度
- Delta 传输算法避免复制已存在的文件
- 总体来说更加强大且功能更强大
- 进一步阅读:和 有何
scp
不同rsync
?
也可以看看:
答案3
我想对文件夹列表执行相同操作,但使用的所有答案都xargs
对我不起作用。最后我简单地解决了这个问题:
scp -r user@server:/location/{"$(cat folder_list.txt | tr '\n' ',' | sed 's/,$//')"} .
我将文件列表传递给 shell 扩展。我认为这对任何寻找替代解决方案的人都可能有帮助。
答案4
上述答案要求您对每个传输的文件进行身份验证。SCP 在 SSH 上运行,GoDaddy 提供对 SSH 上其他命令(如 tar)的访问。因此,最好的方法是通过以下方式将 tar 与 ssh 结合使用:
tar -T <file> -cf - | ssh <user>@<host> "tar -C <dir> -xvf -"
如果文件列表在 STDIN 上,您可以执行以下操作:笔记:cat 在这里仅用于生成 STDIN
cat <file> | tar -T - -cf - | ssh <user>@<host> "tar -C <dir> -xvf -"
为了以额外的处理时间为代价减少传输时间,您可以向两个 tar 命令添加 -z 或 -j 以分别启用 gzip 或 bzip 压缩。