web-dev-qa-db-fra.com

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

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

315
Olivier Lalonde

cp n’ayant pas cette fonctionnalité, vous pouvez utiliser pv pour le faire:

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 génère simplement le fichier dans 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 Installez pv (vous pouvez également 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, > redirige la sortie standard du 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 sur stdout). pv est comme cat, mais si vous redirigez son flux de sortie ailleurs, il affichera les informations de progression sur stdout.

Regardez man pv pour en savoir plus à ce sujet.


Une autre option, comme alt textDoR suggère 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.

240
Stefano Palazzo

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

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

  • indication de progression de transfert
  • copie en continu en cas d'erreur (passez au fichier suivant)
  • enregistrement de l'état 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 supprimer votre support en toute sécurité pour pouvoir vous assurer que le processus de transfert s'est terminé avec succès.

gcp est utilisé pour copier des fichiers et comporte des options telles que --preserve afin de pouvoir conserver divers attributs et autorisations et --recursive pour pouvoir copier des répertoires entiers. Vous trouverez plus d'informations sur ses options en saisissant man gcp ou en accédant à la page pages de manuel Ubuntu en ligne . Un tutoriel est également disponible sur ce site .

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

87
user76204

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.

63
mathemagician

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 sur la progression. par exemple.

cp -rv old-directory new-directory
26
Ubuntourist

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 from 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)
...
20
Jürgen Weigert

Il existe un outil appelé progress dans les référentiels, capable d’examiner différentes 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)
14

Il existe un nouvel outil appelé cv qui peut trouver n’importe quel descripteur associé à une commande en cours d’exécution 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.

11
naugtur

Alors que pvpeut traiter des tâches locales cpname__, l'utilisation de ddavec pvpeut traiter à la fois des tâches locales (cpname__) et distantes (scpname__).

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

Veuillez vous assurer que path/to/dest.mkv se termine 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 partie distante

Alors que scppeut à peine montrer l'avancement actuel, utiliser ddavec pvest un jeu d'enfant.

ssh onemach@myotherhost dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv
11
onemach

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?

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

Pour lancer mes 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écutez watch ls -lh DIR sur 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.

En guise d'alternative pour des situations moins triviales, par ex. copie récursive des répertoires, vous pouvez utiliser watch du -hs DIR pour afficher un résumé de la taille du répertoire DIR. Toutefois, du temps peut prendre du temps à calculer et peut même ralentir la copie. Vous pouvez donc utiliser l’argument -n INTERVAL pour que le compromis soit acceptable.

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

watch "du -hs backup/*"

sinon les jokers ne seront développés qu'une seule fois , lorsque la montre est lancée donc du ne regardera pas les nouveaux fichiers/sous-répertoires.

6
Alois Mahdal

Si vous avez rsync 3.1 ou version supérieure (rsync --version), vous pouvez copier (cp -Rpn) tout en préservant les autorisations et la propriété, créer des répertoires récursifs, "aucun ordre" et afficher la progression globale (au lieu de la progression par fichier), le taux de copie (très approximatif) temps estimé 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. De plus, 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-i-r 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").

5
S Lentz

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

Des outils tels que pv ou rsync permettent d'afficher la progression du transfert d'un fichier volumineux, mais lorsqu'il s'agit de copier des répertoires/arbres entiers, mc calcule la taille, puis l'affiche très bien. De plus, il est disponible immédiatement sur la majorité des systèmes.

3
kralyk

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% [===============================>                      ]

Source

2
Jan

une option supplémentaire pour préserver les attributs pourrait être (si sourceest un dossier, il sera créé dans destinationname__)

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

espérons que cela pourra être utile à quelqu'un. Pour obtenir une estimation du temps de transfert, il est possible d’effectuer do -s source à l’avance et de le transmettre comme paramètre -s <size> à pvname__.

1
ciekawy

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é supreme

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

0
KIRAN B

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] [     <=>                                                                   ] 
0
alecail

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

0
McKelvin