web-dev-qa-db-ja.com

コマンドラインから「cp」を実行するときに転送速度を表示しますか?

これは可能ですか?

50
Chris

標準のcoreutils cpコマンドはこれをサポートしていません。 Gentooには、さまざまなバージョンに追加されるGentooパッチが浮かんでいますが、何らかの理由でGentooには含まれていません。 coreutils 6.10のバージョンは bugzillaで で、他にもたくさんあると思います。

cpにパッチを適用しない場合は、他のコマンドを使用する必要があります。たとえば、rsyncには--progressフラグなので、次のことができます。

rsync --progress source destination

コピーする代わりにデータをcatし、stdoutを宛先にリダイレクトする場合(つまり、cat source > destination)の場合、パイプのスループットを測定し、途中に挿入するプログラムを使用できます(cat source | SOME-PROGRAM > destination); この関連する質問 で言及されているカップルがあります。私がお勧めしたのは pv (パイプビューア)です。

Screenshot of pv from the pv homepage

--rateフラグは転送速度を示します

53
Michael Mrozek

この方法でpvを使用すると、その目的にうまく機能することがわかりました

pv -p file1 > file2

-pスイッチは、ファイル転送の進行状況を表示します。転送速度を確認するには、-rスイッチ。時間の経過に伴う平均転送速度を確認したい場合は、-aスイッチ。

pv -pra file1 > file2
17
Patrick

これはかなり古いですが...

実際にレートを表示したくないが、大きなファイルのコピーで何かが起こっている場合にのみ監視したい場合は、watchコマンドを使用することもできます(mvでも機能します) ):

cp /path/to/myfile /path/to/target/myfile

次に、別のシェルで、またはコピーコマンドをバックグラウンドにプッシュします(例:Ctrl + Zの後にbg)が続く場合は、次のコマンドで結果を確認できます。

watch "ls -sh1 /path/to/target"

これにより、lsコマンド更新の出力が継続的に更新され(デフォルトでは2.0秒ごと)、次のようなものが表示されます。

Every 2.0s: ls -sh1 /path/to/target                                      
Tue Jan 12 15:02:45 2016

total 1.1G
4.0K data
130M tmp1.txt
137M tmp2.txt
151M tmp3.txt
168M tmp4.txt
162M myFile
9
muelleth

こんにちは転送速度を示す別の方法は、次のようにlocalhostでscpを使用することです。
scp -rv src_folder user@localhost:/dest_folder

5
Christoph Kuhr

以下は、duを使用してスループットを監視するスクリプトです。これはよりアプリケーションに依存せず、 https://unix.stackexchange.com/a/301490/183269 でも参照されます。宛先ホストでスクリプトを実行します。

monitorio () {
# show write speed for file or directory
    interval="10"
    target="$1"
    size=$(du -ks "$target" | awk '{print $1}')
    firstrun="1"
    echo ""
    while [ 1 ]; do
        prevsize=$size
        size=$(du -ks "$target" | awk '{print $1}')
        #size=$(ls -l "$1"  | awk '{print $5/1024}')
        kb=$((${size} - ${prevsize}))
        kbmin=$((${kb}* (60/${interval}) ))
        kbhour=$((${kbmin}*60))
        # exit if this is not first loop & file size has not changed
        if [ $firstrun -ne 1 ] && [ $kb -eq 0 ]; then break; fi
        echo -e "\e[1A $target changed ${kb}KB ${kbmin}KB/min ${kbhour}KB/hour size: ${size}KB"
        firstrun=0
        sleep $interval
    done
}

使用例:

user@Host:~$ dd if=/dev/zero of=/tmp/zero bs=1 count=50000000 &
user@Host:~$ monitorio /tmp/zero
/tmp/zero changed 4KB 24KB/min 1440KB/hour size: 4164KB
/tmp/zero changed 9168KB 55008KB/min 3300480KB/hour size: 13332KB
/tmp/zero changed 9276KB 55656KB/min 3339360KB/hour size: 22608KB
/tmp/zero changed 8856KB 53136KB/min 3188160KB/hour size: 31464KB
^C
user@Host:~$ killall dd; rm /tmp/zero
1
gesell