493 votes

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

Sinon, y a-t-il une autre utilitaire en ligne de commande qui puisse réaliser cela?

1 votes

2 votes

Au cas où vous auriez déjà lancé la commande cp et que vous ne voulez pas l'arrêter maintenant, vous pouvez watch la taille de la destination augmenter comme ceci: askubuntu.com/a/1275972/327339 (watch 'du -hs'), pour savoir qu'elle augmente vraiment et que la copie fonctionne.

366voto

andybee Points 497

Alors que cp n'a pas cette fonctionnalité, vous pouvez utiliser pv pour le faire :

pv mon_fichier > sauvegarde/mon_fichier

Remarque : cette méthode fera perdre les permissions 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 appartiendront.

Dans cet exemple, pv se contente essentiellement de renvoyer le fichier vers stdout*, que vous redirigez vers un fichier à l'aide de l'opérateur >. Simultanément, il affiche des informations sur la progression dans le terminal lorsque vous le faites.

Voici à quoi cela 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 (ou bien tapez sudo apt-get install pv) sur votre système.


*: L'aspect technique

Il y a 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 pas plus compliqué que

cat source > destination

(où cat se contente de lire un fichier et de l'afficher sur stdout). pv est tout comme cat, mais si vous redirigez son flux de sortie ailleurs, il affichera des informations sur la progression sur stdout à la place.

Jetez un œil à man pv pour en savoir plus à ce sujet.


Une autre option, comme texte alternatifDoR le 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 préservera les permissions/propriétés des fichiers tout en affichant la progression.

3 votes

Il peut être significatif ou non (selon la situation), mais pv ne gère pas les permissions de la même manière que cp le fait... (selon un test rapide que j'ai essayé : pv n'a pas copié le bit d'exécution tandis que rsync l'a fait.

0 votes

Merci de me le rappeler fred.beak, je n'y avais pas pensé.

67 votes

IMO: alias cp="rsync -avz" cp est obsolète.

343voto

bartekbrak Points 4327

Il n'y en a pas. Voir ici pourquoi. Bien qu'il fasse plus que ce dont vous avez besoin, rsync a un paramètre --progress. Le -a conservera les autorisations, etc., et le -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)

17 votes

Cela fonctionne très bien dans l'Ubuntu actuel (14.10). Il prend également en charge le drapeau -r pour parcourir les répertoires. Il peut même être aliasé comme un remplacement direct de cp: alias cp="rsync -ah --progress"

1 votes

Fonctionne parfaitement sur OS X, avec en prime la possibilité d'utiliser les outils inclus dans le système.

0 votes

C'est génial, la sortie ressemble à nom du fichier Mo-copiés Mo-vitesse temps-restant)

106voto

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

  • indication de progression du transfert
  • copie continue en cas d'erreur (passer au fichier suivant)
  • journalisation de l'état de la copie : gcp consigne toutes ses actions pour qu'il soit possible de savoir quels fichiers ont été copiés avec succès
  • modification des noms pour gérer les limitations du système de fichiers cible (par exemple suppression des caractères incompatibles "*" ou "?" sur FAT)

Cependant, même lorsque la barre de progression 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 support afin de vous assurer que le processus de transfert s'est terminé avec succès.

gcp est utilisé pour copier des fichiers et propose des options telles que --preserve pour que divers attributs et autorisations puissent être préservés et --recursive pour que des répertoires entiers puissent être copiés. Plus d'informations sur ses options peuvent être trouvées en saisissant man gcp ou en allant sur les manpages Ubuntu en ligne. Un tutoriel est également disponible sur ce site.

Installez gcp à partir des dépôts avec

sudo apt-get install gcp

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

Vous pouvez copier un fichier sur votre support en entrant

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

et copier un dossier sur votre support avec

gcp -rv ~/Podcasts /media/Mik2

Sortie d'exemple de gcp avec la barre de progression :

gcp ~/Vidéos_incIplayer/mars.flv /media/Mik2
Copie de 168.57 Mio 100% |########################################################|   7.98 M/s Temps : 00:00:22

Vous pouvez bien sûr spécifier plusieurs fichiers ou dossiers à copier sur votre disque, et il existe de nombreuses autres options couvertes dans man gcp.

6 votes

L'erreur avec cela sur ssh dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NotSupported: Impossible de lancer automatiquement un dbus-daemon sans un $DISPLAY pour X11

3 votes

Si vous avez un affichage X11 ouvert sur la machine, vous pouvez simplement définir export DISPLAY=:0.0 avant de démarrer gcp. Si la machine est sans affichage, vous devrez démarrer une session X dans un framebuffer virtuel ou quelque chose du genre, à ce moment-là, vous devriez probablement chercher un autre programme.

3 votes

gcp est assez décent mais l'exigence de DBUS/X est étrange. J'ai géré cela via SSH en utilisant le transfert SSH : ssh -X user@host et cela m'a permis de l'exécuter.

95voto

mathemagician Points 951

Je prends plaisir à utiliser cURL à cette fin précise. La page de manuel répertorie le protocole "FILE" comme pris en charge, il suffit donc de l'utiliser comme n'importe quel autre protocole dans une URL :

curl -o destination FILE://source

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

2 votes

Ceci est génial surtout dans les environnements où vous êtes empêché d'installer de nouveaux outils et où rsync n'est pas disponible.

12 votes

Brillant, cela doit être un hack incontournable!

0 votes

Belle réponse! Astucieux!

48voto

Il existe un outil appelé progress dans les dépôts qui est capable d'examiner différentes commandes et d'afficher des informations de progression pour chacune d'entre elles.

Installez-le en utilisant la commande :

sudo apt-get install progress

Cet outil peut être utilisé de la sorte :

cp grosfichier nouveaufichier & progress -mp $!

Sortie :

[11471] cp /media/Backup/Downloads/NOMDUFICHIER.fichier 
        29.9% (24.2 Mio / 16 Mio)

4 votes

C'est à mon avis la réponse la plus à jour en 2019.

0 votes

progress n'est pas utile pour le scripting général, seulement dans un contexte de watch: a) Il a besoin d'un tty en plein écran et échoue avec Error opening terminal: unknown. sinon. Par conséquent, vous ne pouvez pas rapporter le progrès à un tube pour afficher le progrès dans un environnement CGI. b) Les shells modernes ne laissent pas les zombies vivants assez longtemps, libérant le PID pour d'autres processus. Par conséquent, il existe une condition de concurrence possible où progress pourrait surveiller le mauvais processus (c'est-à-dire que progress est chargé via NFS). c) Il est incapable de surveiller des choses comme sleep ce qui est possible avec strace ou dtrace et un peu de script supplémentaire.

0 votes

Travailler en 2021 comme un charme, merci beaucoup

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X