无需 tar 即可合并多个文件

无需 tar 即可合并多个文件

我有一个包含 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 隧道)

建议的解决方案

  1. 目录树中的所有文件

    cd /path/to/top/source/directory
    rsync -avPR -e ssh . remoteuser@remotehost:/path/to/top/destination/directory
    
  2. 文件中列出的文件名

    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 用户身份登录。

相关内容