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

326

Sinon, existe-t-il un autre utilitaire de ligne de commande capable d’atteindre cet objectif?

Olivier Lalonde
la source

Réponses:

249

Bien que cpvous n'ayez pas cette fonctionnalité, vous pouvez utiliser pvceci:

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, pvle fichier est simplement sorti sur stdout *, que vous redirigez vers un fichier à l'aide de l' >opérateur. Simultanément, il imprime des informations sur la progression sur le terminal lorsque vous le faites.

Voici à 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 (alternativement, taper 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, >réoriente d'un programme sur la sortie standard dans un fichier. cpfondamentalement ne fait rien de plus chic que

cat source > destination

(où catjuste lit un fichier et l’imprime sur stdout). pvest comme cat, mais si vous redirigez son flux de sortie ailleurs, il affichera les informations de progression sur stdout.

Jetez un coup d'oeil man pvpour en savoir plus à ce sujet.


Une autre option, comme le suggère texte alternatifDoR dans cette réponse , consiste à 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 autorisations / la propriété des fichiers tout en affichant la progression.

Stefano Palazzo
la source
3
Il peut ou non être significatif ( en fonction de la situation), mais pvne la même manière que gère pas les autorisations cpne ... (basé sur un test rapide j'ai essayé: pvne pas copier le bit d' exécution à travers .. rsync. A fait
Peter .O
45
IMO: alias cp="rsync -avz"cp est obsolète.
Marco Ceppi
11
Si vous êtes comme moi et oubliez pvça, vous pouvez aller fouiner /proc/PID of cp/fdet /proc/PID of cp/fdinfocomprendre le progrès. (C'est à vous d'inférer la vitesse.) J'utilise cette technique pour regarder updatedb.
Thanatos
11
Oui, -zne devrait probablement être utilisé que pour les copies réseau; la compression et la décompression des données pour une copie locale est une simple surcharge.
Matthew Lu
3
@MarcoCeppi, lors de la copie d'un répertoire en prenant soin de rsyncne pas ajouter de fin /au chemin source (ou de le supprimer si, par exemple, l'achèvement de bash le met là automatiquement). Sinon, vous obtiendrez des résultats différents de ceux obtenus avec cp(ou gcp).
Piotr Findeisen
185

Il n'y a pas. Voir ici pour savoir pourquoi. Bien qu'il fasse plus que ce dont vous avez besoin, il rsyncpossède un --progressparamètre. Le -aconservera les autorisations, etc., et -hsera 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)
Bartekbrak
la source
4
Cela fonctionne très bien dans l'actuel Ubuntu (14.10). Il prend également en charge le -rdrapeau pour recurse répertoires. Il peut même être aliasé en remplacement direct de cp:alias cp="rsync -ah --progress"
rustyx
1
Fonctionne bien sur OS X, avec le bonus de pouvoir utiliser les outils inclus avec le système.
Ivan X
3
j'aime cette alternative mieux que pv, spécialement parce que rsync fait partie de l'installation standard
Joao Costa
1
@bartekbrak merci pour le partage. Je suis actuellement sur macOS 10.12.x avec la version homebrew de rsync 3.1.2 et avec l’utilisation --progressme fait tourner la tête, je regarde tout l’affichage de la sortie dans le terminal. Donc, ceux qui viennent ici à partir de recherches par mot-clé AOL rsync -ah --info=progress2 [source] [destination] présentent la sortie de manière un peu plus saine, à mon humble avis.
ipatch
2
Malheureusement, la sortie n’est pas très utile lors de la copie de nombreux petits fichiers.
Raphaël
89

Si vous voulez voir si vos fichiers sont correctement transférés, vous pouvez utiliser gcpet gcpressemble à cp, mais vous obtiendrez par défaut une barre de progression vous permettant de voir ce qui est copié. Comme le note le wiki du programme , gcpa plusieurs fonctionnalités utiles telles que

  • indication de progression de transfert
  • copie en continu en cas d'erreur (passez au fichier suivant)
  • enregistrement du statut de la copie: gcp enregistre toutes ses actions afin qu'il soit possible de savoir quels fichiers ont été copiés avec succès
  • changement de nom 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 a atteint 100% lors de l'utilisation de l'outil, vous devez attendre que votre invite de terminal réapparaisse avant de retirer votre média en toute sécurité pour pouvoir vous assurer que le processus de transfert s'est terminé avec succès.

gcpest utilisé pour copier des fichiers et comporte des options --preservepermettant, par exemple, de conserver divers attributs et autorisations et de copier --recursivedes répertoires entiers. Pour plus d’informations sur ses options, consultez man gcpou en consultant les pages de manuel Ubuntu en ligne . Un tutoriel est également disponible sur ce site .

Installer à gcppartir 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 support en entrant

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

et copier un dossier sur votre support avec

gcp -rv ~/Podcasts /media/Mik2

Exemple de sortie gcpavec 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 sûr spécifier plusieurs fichiers ou dossiers à copier sur votre disque, et de nombreuses autres options sont couvertes dans man gcp.


la source
4
Vous avez une erreur avec sshdbus.exceptions.DBusException: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
msa7
3
Si vous avez un écran X11 ouvert sur la machine, vous pouvez simplement le configurer export DISPLAY=:0.0avant de démarrer gcp. Si la machine est sans tête, vous devrez alors démarrer une xsession dans un framebuffer virtuel ou quelque chose du
genre
2
gcpest assez décent, mais l’exigence DBUS / X est étrange. J'ai géré cela sur SSH en utilisant le transfert ssh: ssh -X user@hostet cela m'a permis de l'exécuter.
Oli
68

J'adore utiliser cURL dans ce but précis. La page de manuel répertorie le protocole "FILE" comme supporté, donc utilisez-le comme n'importe quel autre protocole dans une URL:

curl -o destination FILE://source

Vitesse, progrès, temps restant et plus encore - le tout dans un format familier.

mathémagicien
la source
1
C'est particulièrement utile dans les environnements où il vous est interdit d'installer de nouveaux outils et où rsync n'est pas disponible.
5
Brillant, cela doit être un hack incontournable!
ionreflex
Bonne réponse! Intelligent!
9301293
Cela a probablement le même inconvénient que de pvne pas enregistrer les autorisations.
Ploni
1
Sucré! un moyen de faire ce travail pour un répertoire?
Joseph Rajeev Motha
28

Bien qu’elle n’affiche pas la vitesse, lors de la copie de plusieurs fichiers, l’ -voption de la cpcommande vous fournira des informations sur la progression. par exemple

cp -rv old-directory new-directory
Ubuntourist
la source
10
Informations sur le progrès? Ceci est juste une sortie commentée. Pour fournir des informations sur les progrès, il vous faudrait au moins maintenant combien de fichiers, ou même quels fichiers, doivent être copiés.
Julian F. Weinert
Il indique dans quel fichier il se trouve, ce qui peut suffire dans des cas moins exigeants.
Gringo Suave
20

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

showspeed à partir de https://github.com/jnweiger/showspeed utilise ces informations. Il peut s'attacher aux programmes 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)
...
Jürgen Weigert
la source
Joli. Comment cela fonctionne-t-il cependant? Je suppose que dans le cas où le fichier est ouvert en lecture seule? Et cela ne fonctionnera probablement pas en cas d'accès dispersé.
j_kubik
1
Dans ce cas , vous pouvez également utiliser un autre terminal pour exécuter pkill -USR1 ddpour faire ddmontrer son statut, une autre option serait watch -n 1 pkill -USR1 ddde le faire montrer ses progrès périodiquement (chaque seconde).
Yaron
Droite. De nombreux outils ont un moyen intégré de rapporter des statistiques au fil du temps. dd ne fait pas exception. Les implémentations modernes ont une option status = progess. Showspeed est une solution de style unix classique "un outil à la fois" - tout comme pv. Mais il a différents cas d'utilisation: pensez aux gobelets qui pompent un fichier via ghostscript ou vous souhaitez connaître l'ETA d'un cp ou d'un tar en cours. Il se peut que 95% soit déjà terminé au bout de quelques heures et que vous ne souhaitiez probablement pas redémarrer simplement pour ajouter du pv ... Un accès dispersé ne fonctionnerait pas bien. Showspeed seuls les échantillons cherchent des positions.
Jürgen Weigert
18

Il existe progressdans les référentiels un outil capable d’examiner diverses commandes et d’afficher des informations sur leur progression.

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)
Nathaniel A Malinowski
la source
12

Alors que pvpeut traiter des cptâches locales , utiliser ddavec pvpeut traiter à la fois les tâches locales ( cp) et distantes ( scp).

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

S'il vous plaît assurer les path/to/dest.mkvsorties partouch 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 100Mci-dessus par la taille réelle de votre fichier source.

Voici la partie distante

Alors que scppeut difficilement montrer les progrès actuels, utiliser ddavec pvest un morceau de gâteau.

ssh onemach@myotherhost dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv
onemach
la source
1
Newer dda status=progress: askubuntu.com/a/824895/52975
Ciro Santilli a annoncé le
11

Il existe un nouvel outil appelé cv qui peut rechercher n’importe quel descripteur associé à une commande en cours et afficher les progrès et la vitesse: https://github.com/Xfennec/cv.

cv -w

affiche les statistiques pour toutes les opérations en cours de cp, mv, etc.

Naugtur
la source
watch cv -qest encore plus propre
nwgat
Il montre uniquement la progression d'un fichier individuel, il réalise si cpun répertoire est copié de manière récursive ou non.
Flimm
1
Il a renommé la guerre pour progresser. Excellent outil!
Sébastian
7

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 non -R):

  1. Voyez la taille du fichier et rappelez-vous

  2. Commencer à copier

  3. Ouvrir un autre terminal

  4. Exécuter watch ls -lh DIRsur le répertoire où se trouve la cible

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

Comme alternative aux situations moins triviales, telles que la copie récursive de répertoires, vous pouvez utiliser watch du -hs DIRpour afficher un résumé de la taille du répertoire DIR. Cependant, la durée de calcul peut être longue et peut même ralentir la copie. Vous pouvez donc utiliser un -n INTERVALargument pour observer les compromis, afin que le compromis soit acceptable.

Mise à jour: Si vous utilisez des wild-cards avec la commande utilisée avec watch, par exemple watch du -hs backup/*, n'oubliez pas de citer:

watch "du -hs backup/*"

sinon les cartes sauvages seront étendues qu'une seule fois , lorsque la montre est commencé si du ne regardera pas de nouveaux fichiers / sous - répertoires.

Alois Mahdal
la source
Ne répond pas à la partie "vitesse", bien que ...
Alois Mahdal
7

dd status=progress

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

dd if=src of=dst status=progress

Le terminal affiche une ligne de type:

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

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

Ciro Santilli 改造 中心 六四 事件
la source
1
Vous vouliez dire: stdout est un flux de caractères et de séquences d'échappement vt100 qui oblige votre terminal à afficher une ligne mise à jour périodiquement;). stdout est toujours un flux d'octets et n'a rien à voir avec son affichage (sauf que l'application peut savoir si elle est actuellement connectée à un terminal ou non ...)
masterxilo
@masterxilo newbs ne s'en souciera pas, les experts le sauront ;-) héhé
Ciro Santilli est décédé
Eh bien, je pense qu'il est toujours bon de dire les choses comme elles sont, peut-être de laisser de côté certains détails, mais ne jamais obliger vos lecteurs à produire un mauvais modèle mental. Si vous dites "stdout est une ligne (mise à jour périodiquement)", il semble que vous disiez que stdout est un bloc de mémoire mutable, ce qui n'est pas le cas. C'est important à savoir, même pour les débutants.
masterxilo
6

Si vous avez rsync 3.1 ou supérieur ( rsync --version), vous pouvez copier (cp-RPN) tout en préservant les autorisations et les droits de propriété, les répertoires récursifs, "aucun éclatement" et afficher la progression générale très approximatif) le temps restant restant avec:

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

Notez que sudo n’est nécessaire que s’il s’agit de répertoires / fichiers qui ne vous appartiennent pas. En outre, sans le --no-i-r, le pourcentage peut être réinitialisé à un nombre inférieur à un moment donné pendant la copie. Peut-être que les versions ultérieures de rsync utiliseront par défaut no-ir avec info = progress2, mais ce n'est pas le cas 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 utiliseriez généralement cp -n "no clobber").

S Lentz
la source
3

Utilisez un script shell:

#!/bin/sh
cp_p()
{
   strace -q -ewrite cp -- "${1}" "${2}" 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' "${1}") count=0
}

Cela ressemblera à:

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

La source

Jan
la source
3

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

Des outils tels que pvou rsyncsont utiles pour afficher la progression du transfert d’un fichier volumineux, mais lorsqu’il s’agit de copier des répertoires / arbres entiers, mccalcule la taille puis affiche très bien la progression. De plus, il est disponible immédiatement sur la majorité des systèmes.

Kralyk
la source
2
"il est disponible directement sur la majorité des systèmes." ... pas sur une installation Ubuntu par défaut.
Muru
1

une option supplémentaire pour préserver les attributs pourrait être (si sourcec'est un dossier, il sera créé destination)

tar -c source | pv -e -t -p -r | tar -C destination  -x

espérons que cela pourra être utile à quelqu'un. Pour avoir une estimation du temps de transfert, cela peut être obtenu en le faisant do -s sourceà l’avance et en le passant comme -s <size>paramètre à pv.

Ciekawy
la source
-f -est redondant. tarLa sortie par défaut pour cet l'entrée pour xsont stdout et stdin.
Muru
Peut-il dépendre de la version OS / tar? Je sais que c'est un site Ubuntu, mais cela pourrait être utile à d'autres propriétaires de systèmes d'exploitation comme macOS
ciekawy
1
Nan. Toutes les implémentations rationnelles (y compris le tar de libarchive, utilisé par macOS) ont ce comportement.
muru
viens de vérifier sur macos et votre suggestion est parfaitement valide - j'ai mis à jour ma réponse. Merci!
Ciekawy
0

Vous pouvez copier utiliser n'importe quel programme. Dans le même temps, vous pouvez démarrer sudo iotopet voir la vitesse de lecture / écriture du disque, mais sans progrès.

McKelvin
la source
0

Vérifiez le code source de progress_bar dans le référentiel git ci-dessous

https://github.com/Kiran-Bose/supreme

Essayez également le package de script bash personnalisé suprême

Téléchargez le fichier deb et installez-le dans une distribution debian ou téléchargez les fichiers source, modifiez-le et utilisez-le pour d'autres distributions

Aperçu de la fonctionnalité

(1) Ouvrez les applications ---- Firefox ---- Calculatrice ---- Paramètres

(2) Gérer les fichiers ---- Rechercher ---- Naviguer ---- Accès rapide

            |----Select File(s)
            |----Inverse Selection
            |----Make directory
            |----Make file
                                          |----Open
                                          |----Copy
                                          |----Move
                                          |----Delete
                                          |----Rename
                                          |----Send to Device
                                          |----Properties

(3) Gérer le téléphone ---- Déplacer / Copier depuis le téléphone ---- Déplacer / Copier vers le téléphone ---- Synchroniser les dossiers

(4) Gérer l'USB ---- Déplacer / Copier depuis l'USB ---- Déplacer / Copier vers l'USB

KIRAN B
la source
0

pv sait comment regarder les descripteurs de fichier avec un pid, que ce soit cp ou autre chose

De la documentation:

   (Linux only): Watching file descriptor 3 opened by another process 1234:

          pv -d 1234:3

   (Linux only): Watching all file descriptors used by process 1234:

          pv -d 1234

Exemple:

md5sum file &
[1] + 1271 suspended
pv -d 1271
417MiB 0:00:17 [12,1MiB/s] [============>                                 ] 29% ETA 0:00:53

$ cp file.mov copy.mov &
[2] 3731
$ pv -d 3731
3:/media/windows/file.mov:  754MiB 0:00:04 [97,2MiB/s] [======================>                       ] 52% ETA 0:00:07
4:/media/windows/copy.mov:  754MiB 0:00:04 [97,3MiB/s] [     <=>                                                                   ] 
alecail
la source