我有一个包含 4 亿个文件的目录。使用 find,我创建了所有文件的列表,如下所示:
/output/custom/31/7/31767937
/output/custom/31/7/317537a
/output/custom/31/7/317537
/output/custom/31/7/317ab
/output/custom/31/7/317bo
/output/custom/31/7/317je
/output/custom/31/7/317ma
/output/custom/31/7/31763
然后,我将该文件拆分为 20 个不同的文件,并运行一个脚本来创建 20 个不同的 tarball:
for i in $(ls x*)
do
tar -cf /tar/$i.tar -T $i &
done
输入文件与/tar
安装点位于不同的驱动器上。该脚本现已运行了 2 天,大约完成了 1/4。此时我可能会让它继续运行。但是,为了将来的参考,我想知道是否有比使用tar
?更好的方法来做到这一点。
我的最终目标是将这些 tarball 移动到 20 个不同的服务器,解压它们并在文件上运行一些脚本。哦,既然我有了 tarball,我也会将它们放在 S3 存储上。
答案1
就转移的便利性而言,我建议rsync
。
优点
- 一个命令搞定一切,一个命令找到它们
- 当网络在传输过程中掉线时可重新启动
- 更少的工作量 - 您不需要拆分/tar 然后传输/解压
- 源服务器可以专注于读取文件,让目标服务器处理写入(更新元数据等潜在的文件系统 IO 冲突减少)
缺点
- 你放弃了迄今为止所做的所有努力
- 这与您考虑的解决方案不同
- 需要两个系统之间的直接连接(实际上不需要,但是您需要提供 ssh 隧道)
建议的解决方案
目录树中的所有文件
cd /path/to/top/source/directory rsync -avPR -e ssh . remoteuser@remotehost:/path/to/top/destination/directory
文件中列出的文件名
cd /path/to/top/source/directory rsync -avPR -e ssh --files-from=/path/to/filelist . remoteuser@remotehost:/path/to/top/destination/directory
第二种解决方案要求相对于源目录顶部列出文件名,因为从文件列表文件获取的文件名也将应用于目标文件系统。
如果您要以 root 身份执行其中任何一项操作,则几乎肯定需要将证书ssh
从源服务器复制到目标服务器,以便您可以以 root 用户身份登录。