将多个大文件传输到 USB 磁盘的快速方法,并在命令行中进行进度更新

将多个大文件传输到 USB 磁盘的快速方法,并在命令行中进行进度更新

我需要将大量特定类型的大文件从内部磁盘传输到 USB SSD 驱动器。我需要传输的文件在5-200GB范围内。我想监控所有文件传输的整体进度,并以快速的速度传输到 USB 磁盘。

我从 rsync 开始,发现以下内容可以提供最佳速度结果:

rsync -W --size-only --protocol=29 --block-size=131072 --no-compress --info=progress2 /home/user/rosbags/*.bag /media/upload_disk/

这给了我 150-180MB/s 的传输速度,并且我获得了所有需要传输的文件的总进度。它似乎有助于将 rsync 中的协议更改为版本 29 或更早版本,并增加 15-20% MB/s。我专门将块大小设置为最大值,以确保这不是限制因素。由于我使用 -W(整个文件)设置,因此它应该使用正常传输而不是增量压缩。我的假设是这应该与直接复制得到的类似,但我可能误解了这些设置。

当我使用 dd 复制单个文件时:

dd if=/home/user/rosbags/2021-10-25-12-22-33.bag bs=131K status=progress of=/media/upload_disk/2021-10-25-12-22-33.bag

对于相同的设置,我获得的传输速度在 500-600MB/s 范围内。在本例中,我使用与 rsync 类似的块大小,以确保它们尽可能相似。

我可以制作一个脚本,使用 dd 单独复制所有文件,同时监视进度,但我认为有更聪明的方法吗?

使用 rsync 或其他标准 Linux 工具。

我已经开始编写一个使用 dd 的 sh 脚本:

    #!/bin/sh
    total_size=$(du -sb /home/agco/ros_bags/| cut -f1)
    for i in  /home/user/ros_bags/*.bag; do
    echo $i
    #filename=$(basename $i)
    #echo $filename
    dd if=$i status=progress bs=64M of=/media/upload_disk/$(basename $i)
    done

我面临的主要挑战是计算总进度的能力,为此我需要提取当前传输的位数。我再次假设,有一些聪明的方法可以做到这一点,但到目前为止还无法找到解决方案。

相关内容