Comment afficher la progression et la vitesse de transfert lors de la copie de fichiers avec cp?

271

Sinon, existe-t-il un autre utilitaire de ligne de commande capable de réaliser cela?

    
posée Olivier Lalonde 14.12.2010 - 05:48
la source

15 réponses

204

Bien que cp n'ait pas cette fonctionnalité, vous pouvez utiliser pv pour cela:

pv my_big_file > backup/my_big_file

Remarque: cette méthode perd les autorisations et la propriété du fichier. Les fichiers copiés de cette manière auront les mêmes autorisations que si vous les aviez créés vous-même et vous appartiendraient.

Dans cet exemple, pv fournit simplement le fichier à stdout *, que vous redirigez vers un fichier à l'aide de l'opérateur > . Simultanément, il imprime des informations sur la progression vers le terminal lorsque vous le faites.

Voilà à quoi ça ressemble:

stefano@ubuntu:~/Data$ pv my_big_file > backup/my_big_file
 138MB 0:00:01 [73.3MB/s] [=================================>] 100% 

Vous devrez peut-être Installer pv (sinon, tapez sudo apt-get install pv ) sur votre système.

*: Le bit technique

Il existe trois flux de données importants dans un système de type Unix: stdout (sortie standard), stderr (erreur standard) et stdin (entrée standard). Chaque programme a les trois, pour ainsi dire. L'opérateur de redirection > redirige la sortie du programme vers un fichier. Sans arguments, comme vous le voyez ci-dessus, > redirige la sortie standard d'un programme vers un fichier. cp ne fait fondamentalement rien de plus sophistiqué que

cat source > destination

(où cat lit simplement un fichier et l’imprime dans stdout). pv est juste comme chat, mais si vous redirigez son flux de sortie ailleurs, il imprimera les informations de progression à stdout à la place.

Regardez man pv pour en savoir plus.

Autre option, DoR suggère dans cette réponse , est d'utiliser rsync à la place:

$ rsync -ah --progress source-file destination-file
sending incremental file list
source-file
        621.22M  57%  283.86MB/s    0:00:01

Cela permettra de conserver les droits / droits sur les fichiers tout en montrant les progrès.

    
réponse donnée Stefano Palazzo 14.12.2010 - 06:17
la source
129

Il n'y en a pas. Voyez ici pourquoi. Bien qu'il fasse plus que ce dont vous avez besoin, rsync en a un avec le paramètre --progress . Le -a gardera les permissions, etc, et -h sera lisible par l'homme.

rsync -ah --progress source destination

La sortie ressemblera à ceci:

Pictures/1.jpg
      2.13M 100%    2.28MB/s    0:00:00 (xfr#5898, to-chk=1/5905)
Pictures/2.jpg
      1.68M 100%    1.76MB/s    0:00:00 (xfr#5899, to-chk=0/5905)
    
réponse donnée bartekbrak 15.10.2012 - 10:06
la source
84

Si vous voulez voir si vos fichiers sont transférés correctement, vous pouvez utiliser gcp et gcp est comme cp mais, par défaut, vous donne une barre de progression pour voir ce qui est copié. Comme le notes du wiki du programme , gcp possède plusieurs fonctionnalités utiles telles que

  
  • Indication de la progression du transfert
  •   
  • copie continue en cas d’erreur (passez au fichier suivant)
  •   
  • consignation de l’état de la copie: gcp enregistre toutes ses actions afin de pouvoir savoir quels fichiers ont été copiés avec succès
  •   
  • modifier le nom pour gérer les limitations du système de fichiers cible (par exemple, la suppression de caractères incompatibles "*" ou "?" sur FAT)
  •   

Toutefois, même lorsque la barre de progression a atteint 100% lors de l’utilisation de l’outil, vous devez attendre que votre invite de terminal réapparaisse avant de retirer en toute sécurité votre média afin de vous assurer que le processus de transfert a abouti.

gcp est utilisé pour copier des fichiers et contient des options telles que --preserve , de sorte que divers attributs et autorisations peuvent être conservés et que --recursive permet de copier des répertoires entiers. Pour plus d'informations sur ses options, entrez man gcp ou consultez les pages de manuel Ubuntu. en ligne . Un tutoriel est également disponible sur ce site .

Installer gcp à partir des référentiels avec

sudo apt-get install gcp

( Remarque : dans Ubuntu 12.10, le nouveau point de montage automatique est, par exemple, /media/user/usbdisk )

Vous pouvez copier un fichier sur votre média en entrant

gcp /home/mike/file.mp4 /media/usb

et copiez un dossier sur votre média avec

gcp -rv ~/Podcasts /media/Mik2

Exemple de sortie de gcp avec la barre de progression:

gcp ~/Videos_incIplayer/mars.flv /media/Mik2
Copying 168.57 MiB 100% |########################################################|   7.98 M/s Time: 00:00:22

Vous pouvez bien entendu spécifier plusieurs fichiers ou dossiers à copier sur votre disque, et beaucoup d’autres options sont couvertes dans man gcp .

    
réponse donnée user76204 15.10.2012 - 13:09
la source
53

J'apprécie d'utiliser cURL dans ce but précis. La page de manuel énumère le protocole "FILE" comme supporté, donc utilisez-le comme n'importe quel protocole dans une URL:

curl -o destination FILE://source

Vitesse, progression, temps restant et plus encore - le tout dans un format familier.

    
réponse donnée mathemagician 02.02.2013 - 10:00
la source
22

Bien qu’elle n’affiche pas la vitesse, lors de la copie de plusieurs fichiers, l’option -v de la commande cp vous fournira des informations de progression. par exemple

cp -rv old-directory new-directory
    
réponse donnée Ubuntourist 14.12.2010 - 18:17
la source
19

Le noyau connaît la plupart des données telles que la vitesse et souvent aussi le pourcentage. Les noyaux modernes exposent ceci via leur système de fichiers / proc.

showspeed de lien utilise cette information. Il peut être associé à des programmes déjà en cours d'exécution et donner des mises à jour périodiques comme ceci:

$ dd if=bigfile of=/tmp/otherbigfile &
$ showspeed dd
dd looks like a process name. pid=4417 matches av0=dd.
p/4417/fd/0r /home/jw/bigfile 113MB/s (12%, 2.3GB)  9m:35
p/4417/fd/1w /tmp/otherbigfile 182MB/s (2.6GB)
p/4417/fd/0r /home/jw/bigfile 285MB/s (15%, 3.0GB)  8m:08
p/4417/fd/0r /home/jw/bigfile 115MB/s (16%, 3.2GB)  8m:01
p/4417/fd/0r /home/jw/bigfile 107MB/s (17%, 3.4GB)  7m:39
p/4417/fd/1w /tmp/otherbigfile 104MB/s (3.5GB)
p/4417/fd/0r /home/jw/bigfile 139MB/s (19%, 3.7GB)  7m:37
p/4417/fd/0r /home/jw/bigfile 116MB/s (20%, 3.9GB)  7m:18
p/4417/fd/1w /tmp/otherbigfile  67MB/s (4.0GB)
p/4417/fd/1w /tmp/otherbigfile 100MB/s (4.1GB)
...
    
réponse donnée Jürgen Weigert 25.02.2014 - 15:34
la source
11

Alors que pv peut gérer les tâches cp locales, utiliser dd avec pv peut gérer à la fois les tâches locales ( cp ) et distantes ( scp ).

dd if=path/to/source.mkv | pv | dd of=path/to/dest.mkv

Veuillez vous assurer que path/to/dest.mkv quitte par touch path/to/dest.mkv

Cela peut montrer la progression, mais si vous voulez les informations de pourcentage,

dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv

Remplacez 100M ci-dessus par la taille réelle de votre fichier source.

Voici la pièce distante

Alors que scp peut difficilement montrer les progrès actuels, utiliser dd avec pv est un jeu d'enfant.

ssh onemach@myotherhost dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv
    
réponse donnée onemach 05.01.2013 - 09:08
la source
10

Il y a un nouvel outil appelé cv qui peut trouver n'importe quel descripteur lié à une commande en cours d'exécution et montrer la progression et la vitesse: lien

cv -w

affiche les statistiques pour toutes les opérations cp, mv, etc. en cours d'exécution

    
réponse donnée naugtur 13.07.2014 - 13:33
la source
10

Il existe un outil appelé progress dans les référentiels, capable d’examiner différentes commandes et d’afficher des informations de progression pour ces derniers.

Installez-le en utilisant la commande

sudo apt-get install progress

Cet outil peut être utilisé comme ça:

cp bigfile newfile & progress -mp $!

Sortie:

[11471] cp /media/Backup/Downloads/FILENAME.file 
        29.9% (24.2 MiB / 16 MiB)
    
réponse donnée Nathaniel A Malinowski 27.09.2016 - 00:35
la source
6

Comme beaucoup l’ont dit, cp n'inclut pas cette fonctionnalité.

Juste pour lancer mon $ 0.02, ce que je fais habituellement avec des situations de copie triviales (c'est-à-dire sans -R ):

  1. Voir la taille du fichier et se souvenir

  2. Lancer la copie

  3. Ouvrir un autre terminal

  4. Exécutez watch ls -lh DIR sur le répertoire où la cible est

Cela peut me tenir au courant de la taille du fichier cible, avec un minimum de tracas.

Comme alternative à des situations moins triviales, par ex. copier récursivement des répertoires, vous pouvez utiliser watch du -hs DIR pour voir le résumé de la taille DIR. Cependant, le calcul peut durer longtemps et peut même ralentir la copie. Vous pouvez donc utiliser l'argument -n INTERVAL pour voir si ce compromis est acceptable.

Mise à jour: si vous utilisez des caractères génériques avec une commande utilisée avec watch du, par exemple watch du -hs backup/* , n'oubliez pas de citer:

watch "du -hs backup/*"

Sinon, les caractères génériques seront étendus une seule fois , lorsque watch démarrera , donc du ne regardera pas les nouveaux fichiers / sous-répertoires.

    
réponse donnée Alois Mahdal 16.11.2012 - 14:20
la source
4

dd status=progress

Option ajoutée dans GNU Coreutils 8.24+ (Ubuntu 16.04):

dd if=src of=dst status=progress

Stdout est une ligne mise à jour périodiquement comme:

462858752 bytes (463 MB, 441 MiB) copied, 38 s, 12,2 MB/s

Voir aussi: Comment surveillez-vous la progression de dd?

    
la source
3

Selon ce que vous voulez faire, Midnight Commander ( mc ) pourrait être la solution. Je suis surpris que cela n'ait pas encore été mentionné.

Les outils tels que pv ou rsync sont bons pour afficher la progression du transfert d'un fichier volumineux, mais lorsqu'il s'agit de copier des répertoires / arborescences entiers, mc calcule la taille et affiche très bien la progression. De plus, il est disponible sur la plupart des systèmes.

    
réponse donnée kralyk 30.01.2016 - 18:33
la source
2

Utilisez un script shell:

#!/bin/sh
cp_p()
{
   strace -q -ewrite cp -- "" "" 2>&1 \
      | awk '{
        count += $NF
            if (count % 10 == 0) {
               percent = count / total_size * 100
               printf "%3d%% [", percent
               for (i=0;i<=percent;i++)
                  printf "="
               printf ">"
               for (i=percent;i<100;i++)
                  printf " "
               printf "]\r"
            }
         }
         END { print "" }' total_size=$(stat -c '%s' "") count=0
}

Cela ressemblera à:

% cp_p /home/echox/foo.dat /home/echox/bar.dat
66% [===============================>                      ]

Source

    
réponse donnée Jan 01.09.2014 - 15:45
la source
2

Si vous avez rsync 3.1 ou supérieur ( rsync --version ), vous pouvez copier (cp -Rpn) tout en conservant les autorisations et les droits de propriété, les répertoires récursifs, "no clobber" et afficher la progression globale , le taux de copie et le temps restant estimé (très grossier) avec:

sudo rsync -a --info=progress2 --no-i-r /source /destination

Notez que sudo n'est nécessaire que si vous traitez des répertoires / fichiers que vous ne possédez pas. De plus, sans le --no-i-r , le pourcentage peut être réinitialisé à un moment donné de la copie. Peut-être les versions ultérieures de rsync utiliseront-elles par défaut no-i-r avec info = progress2, mais pas dans la version actuelle de 3.1.2.

J'ai constaté que le pourcentage et le temps restant étaient largement surestimés lors de la copie dans un répertoire contenant déjà des fichiers (c'est-à-dire, comme lorsque vous utilisiez généralement cp -n "no clobber").

    
réponse donnée S Lentz 02.03.2016 - 23:22
la source
0

Vous pouvez copier n'importe quel programme. Dans le même temps, vous pouvez lancer sudo iotop et voir la vitesse de lecture / écriture du disque, mais sans progression.

    
réponse donnée McKelvin 11.01.2018 - 16:47
la source

Lire d'autres questions sur les étiquettes