web-dev-qa-db-fra.com

Afficher la vitesse de transfert lors de l'exécution de "cp" à partir de la ligne de commande?

Est-ce possible?

50
Chris

La commande standard coreutils cp ne prend pas cela en charge. Il y a un patch Gentoo flottant qui l'ajoute pour différentes versions, bien qu'il ne soit plus inclus dans Gentoo pour une raison quelconque; la version pour coreutils 6.10 est dans leur bugzilla , et je suis sûr qu'il y en a beaucoup d'autres autour.

Si vous ne voulez pas patcher cp, vous devez utiliser une autre commande. Par exemple, rsync a un --progress flag, vous pouvez donc faire:

rsync --progress source destination

Si au lieu de copier, vous récupérez les données, puis redirigez la sortie standard vers la destination (c'est-à-dire cat source > destination), vous pouvez alors utiliser un programme qui mesure le débit des tuyaux et l'insérer au milieu (cat source | SOME-PROGRAM > destination); il y a un couple mentionné dans cette question connexe . Celui que j'ai recommandé était pv (Pipe Viewer):

Screenshot of pv from the pv homepage

Si vous lui donnez le --rate flag il affichera le taux de transfert

53
Michael Mrozek

Je trouve que l'utilisation de PV de cette manière fonctionne bien à cette fin

pv -p file1 > file2

Le -p Le commutateur affiche la progression du transfert de fichiers. Pour voir la vitesse de transfert, ajoutez le -r commutateur. Si vous souhaitez voir le taux de transfert moyen au fil du temps, vous pouvez utiliser le -a commutateur.

pv -pra file1 > file2
17
Patrick

Je sais que c'est plutôt vieux, mais ...

Si vous ne souhaitez pas réellement afficher le débit, mais souhaitez uniquement voir si quelque chose se passe lors de la copie d'un fichier volumineux, vous pouvez également utiliser simplement la commande watch (fonctionne également avec mv ):

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

Ensuite, dans un autre Shell, ou en poussant la commande de copie en arrière-plan (par exemple avec Ctrl + Z suivi de bg), vous pouvez vérifier le résultat avec:

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

Cela mettra à jour en continu la sortie de la mise à jour de la commande ls (par défaut toutes les 2.0s), affichant quelque chose comme:

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

Salut Une autre façon de montrer la vitesse de transfert est d'utiliser scp sur localhost comme ceci:
scp -rv src_folder user@localhost:/dest_folder

5
Christoph Kuhr

Voici un script qui utilise du pour surveiller le débit. Ceci est plus indépendant de l'application et est également référencé dans https://unix.stackexchange.com/a/301490/183269 . Exécutez le script sur l'hôte de destination.

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
}

exemple d'utilisation:

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