it-swarm-pt.com

Exibir velocidade de transferência ao executar "cp" na linha de comando?

Isso é possível?

50
Chris

O comando padrão coreutils cp não suporta isso. Existe um patch do Gentoo que o adiciona para diferentes versões, embora não esteja mais incluído no Gentoo por algum motivo; a versão para o coreutils 6.10 é no bugzilla , e tenho certeza que existem muitas outras por aí.

Se você não deseja consertar cp, precisará usar outro comando. Por exemplo, rsync tem um --progress sinalizador, para que você possa fazer:

rsync --progress source destination

Se, em vez de copiar, você catar os dados e redirecionar o stdout para o destino (ou seja, cat source > destination), você pode usar um programa que mede a taxa de transferência do tubo e insira-o no meio (cat source | SOME-PROGRAM > destination); há alguns mencionados em esta questão relacionada . O que eu recomendei era pv (Pipe Viewer):

Screenshot of pv from the pv homepage

Se você der o --rate sinaliza que mostrará a taxa de transferência

53
Michael Mrozek

Acho que usar o PV dessa maneira funciona bem para esse fim

pv -p file1 > file2

A opção -p Mostra o progresso da transferência de arquivos. Para ver a velocidade de transferência, adicione a opção -r. Se você quiser ver a taxa de transferência média ao longo do tempo, use a opção -a.

pv -pra file1 > file2
17
Patrick

Eu sei que isso é bastante antigo, mas ...

Se você realmente não deseja exibir a taxa, mas deseja apenas observar se algo está acontecendo na cópia de um arquivo grande, também pode usar o comando watch (também funciona com mv ):

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

Em seguida, em outro Shell ou empurrando o comando de cópia para segundo plano (por exemplo, com Ctrl + Z seguido por bg), você pode verificar o resultado com:

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

Isso atualizará continuamente a saída da atualização do comando ls (por padrão a cada 2.0s), exibindo algo como:

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

Oi Outra maneira de mostrar a velocidade de transferência é usar scp em localhost como este:
scp -rv src_folder [email protected]:/dest_folder

5
Christoph Kuhr

Aqui está um script que usa du para monitorar a taxa de transferência. Isso é mais independente de aplicativo e também é mencionado em https://unix.stackexchange.com/a/301490/183269 . Execute o script no host de destino.

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
}

exemplo de uso:

[email protected]:~$ dd if=/dev/zero of=/tmp/zero bs=1 count=50000000 &
[email protected]:~$ 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
[email protected]:~$ killall dd; rm /tmp/zero
1
gesell