명령줄에서 진행 상황을 업데이트하여 여러 개의 대용량 파일을 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

제가 가진 주요 과제는 현재 전송된 비트 수를 추출해야 하는 전체 진행률을 계산하는 능력입니다. 나는 이것을 수행하는 영리한 방법이 있다고 다시 가정하고 있지만 지금까지 해결책을 찾지 못했습니다.

관련 정보