web-dev-qa-db-fra.com

Est-il possible de voir la vitesse et le pourcentage de copie copiés?

Je rencontre des problèmes lors de la copie de gros fichiers à l'aide de nautilus (il se bloque). Je dois copier, en utilisant cp. Je voudrais savoir s'il y a des paramètres qui montrent le% copié et aussi la vitesse de transfert.

272
eez0

rsync a un drapeau appelé progress2 qui indique le pourcentage global:

rsync --info=progress2 source dest
216
eez0

Si vous autorisez d'autres outils que cp c'est sûrement possible. Pour un seul fichier, vous pouvez utiliser pv. C'est un petit outil fournissant de belles statistiques.

pv inputfile > outputfile

Si vous avez plusieurs fichiers ou répertoires, vous pouvez utiliser tar:

tar c sourceDirectory | pv | tar x -C destinationDirectory

Vous pouvez l'encapsuler dans une fonction Shell. C'est moins à taper et vous obtenez une sémantique proche de celles de cp. Voici une fonction très simple (et non à l'épreuve des erreurs!):

cpstat () {
  tar c "$1" | pv | tar x -C "$2"
}

Notez que certaines versions de tar ne prennent pas en charge la syntaxe susmentionnée (par exemple Solaris tar) et vous devez utiliser la variante suivante:

cpstat () {
  tar cf - "$1" | pv | (cd "$2";tar xf -)
}

Tu l'appelles comme ça

cpstat sourceDirectory destinationDirectory

Vous pouvez l'améliorer davantage, afin que pv fournisse une estimation du temps restant.

Une autre solution (comme le mentionne frostschutz dans un commentaire) consiste à utiliser rsync avec le --progress option:

rsync --progress -a sourceDirectory destinationDirectory
107
Marco

rsync fonctionne le mieux pour montrer la progression pendant la progression de la copie.

ex:

rsync -avh --progress sourceDirectory destinationDirectory
65

Est-il possible de voir la vitesse et le pourcentage de copie copiés?

Oui, il est possible d'afficher la progression de la commande cp sur le terminal.


Méthode n ° 1: (utilisez progress)

Ouvrez un nouveau terminal et tapez progress il affichera la progression de la commande cp et d'autres commandes telles que:

cp, mv, dd, tar, cat, rsync, grep, fgrep, egrep, cut, sort, md5sum, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum, adb, gzip, gunzip, bzip2, bunzip2, xz, unxz, lzma, unlzma, 7z, zcat, bzcat, lzcat, split, gpg

Si vous n'avez pas installé progress, vous pouvez l'installer à partir du référentiel, par exemple dans le CentOS avec cette commande: yum -y install progress.

Ensuite, après avoir exécuté la commande cp en arrière-plan, ou après avoir exécuté cp normalement, ouvrez un autre terminal, alors essayez simplement cette commande:

# progress -m

Voir la sortie:

[30904] cp /home/user/file.mp4
        2.3% (200.9 MiB / 8.4 GiB) 3.6 MiB/s remaining 0:38:58

Méthode n ° 2: (utilisez le patch cp)

Ou téléchargez le GNU coreutils et corrigez-le.

cd /tmp
wget http://ftp.gnu.org/gnu/coreutils/coreutils-8.21.tar.xz
tar -xvJf coreutils-8.21.tar.xz
cd coreutils-8.21
wget https://raw.githubusercontent.com/atdt/advcpmv/master/advcpmv-0.5-8.21.patch
patch -p1 -i advcpmv-0.5-8.21.patch

Courir:

export FORCE_UNSAFE_CONFIGURE=1
./configure
make

Copiez les deux fichiers cp et mv placés sous coreutils-8.21/src/ à /usr/local/bin:

cp src/cp /usr/local/bin/cp
cp src/mv /usr/local/bin/mv

Ou copiez-le en utilisant votre gestionnaire de fichiers en tant que root

Ajoutez les lignes suivantes à votre ~/.bashrc:

alias cp='cp -gR'
alias mv='mv -g'

Déconnexion et connexion

La barre de progression peut être affichée sans le –g ou –progress-bar tel que recommandé par l'auteur

Voir la sortie:

0 files copied so far...                                              194.4 MiB /   8.4 GiB
[||--------------------------------------------------------------------------------]  2.3 %
Copying at   3.3 MiB/s (about 0h 5m 47s remaining)
/home/user/file.mp4                                                   194.4 MiB / 446.1 MiB
[||||||||||||||||||||||||||||||||||||----------------------------------------------] 43.6 %

Source: linuxhelp

31
GAD3R

Comme expliqué dans d'autres réponses, cp ne fournit pas cette fonctionnalité. Cependant, progress (anciennement appelé cv) est un petit outil qui est très utile pour fournir cette fonctionnalité manquante.

Cet outil peut être décrit comme une commande Tiny Dirty Linux uniquement * C qui recherche les commandes de base de coreutils (cp, mv, dd, tar, gzip/gunzip, cat, ...) en cours d'exécution sur votre système et affiche le pourcentage de copie Les données.

Je l'utilise depuis quelques mois et c'est solide.

31
Amr Mostafa

J'ai remarqué que cette annonce était un peu vieille. Mais comme j'ai trouvé une solution au problème, j'ai pensé publier ma solution.

Scénario: Nous avons une très grande structure de répertoires que nous voulons copier, donc nous émettons la commande cp -R sourcedir destdir dans une fenêtre de terminal.

Ouvrez une autre fenêtre de terminal ou poussez le processus en arrière-plan (Ctrl+Z,bg<CR>), alors faisons un indicateur de progression à la manière du ghetto:

Nous obtenons d'abord la taille totale de la structure de répertoires que nous voulons copier, vous le faites avec:

du -sh /path/sourcedirectory/

Convertissez le résultat en gigaoctets (G), puis remplacez le n par le résultat obtenu dans la variable sourcesize. Une fois que vous avez inséré la source et destdir (répertoire de destination), exécutez la commande ci-dessous.

while true; do sourcesize=n destdir=/path/destinationdirectory/ copyprogress="$(export | du -sh $destdir | awk '{print $1}' | sed 's/[^0-9.]*//g' )" ; echo "scale=3 ; $copyprogress / $sourcesize * 100" | bc | xargs echo -n ; echo % completed ; sleep 10 ; done

Cela affichera la progression toutes les 10 secondes avec des messages comme:

0.100% completed
0.200% completed
0.300% completed 
... etc

Je suis conscient que cette solution n'a pas abordé la vitesse de copie, mais il serait possible d'ajouter cela en développant les commandes ci-dessus, en en faisant éventuellement un script bash afin qu'il soit plus facile à lire. Par exemple, en vérifiant la quantité de données copiées, pr. n unité de temps, la vitesse doit être triviale à calculer et à afficher.

15
NordicViking

Pour améliorer la réponse de Marco, j'ai écrit aujourd'hui cette version de cpstat, afin que vous puissiez copier de nombreux répertoires et utiliser le dernier paramètre comme chemin de destination. Notez que si vous utilisez un chemin profond relatif comme source, vous pouvez, grâce à tar, créer automatiquement la même arborescence de répertoires dépendants.

function cpstat () {

    tar -cf - "${@: 1: $#-1}" |
    pv -s "$( du -cs -BK --apparent-size "${@: 1: $#-1}" |
              tail -n 1 |
              cut -d "$(echo -e "\t")" -f 1)" |
    ( cd "${@: $#}"; tar -xf - )

;}
9
poe84it

Pas dans une version standard de cp .

Vous pouvez en arrière-plan le cp et la liste la taille en attendant que cp se termine.

J'utilise ce Perl pour surveiller la croissance d'un seul fichier mais il s'exécute en externe sur le cp (ou quoi que je fasse d'autre)

6
Matt

Une autre solution simple consiste à simplement regarder le dossier de sortie comme suit:

Linux/Cygwin: watch -n 10 --differences du -sk --apparent-size <WATCHED_FOLDER>

FreeBSD: gnu-watch -n 10 --differences du -sk <WATCHED_FOLDER>

Cet utilitaire pratique exécutera du et mettra en évidence les différences.

Une autre solution potentielle serait d'écrire un script simple qui boucle, appelant du et crachant une estimation approximative du débit.

5
Timothy C. Quinn

J'ai trouvé cela à utiliser, fonctionnait très bien:

Sudo watch lsof -p`pgrep -x cp`

à partir d'un commentaire de Mike sur la question comment vérifier la progression de l'exécution de cp

5
techbio

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 régulièrement mise à jour comme:

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

Voir aussi: Comment surveillez-vous la progression de dd? | Demandez à Ubunt

Même si rsync vous donnera des statistiques de progression, si vous voulez une barre de progression, vous devez utiliser pv.

Vous pouvez utiliser cpv, un wrapper pour pv avec une syntaxe plus simple, plus similaire à celle de cp que vous pouvez utiliser pour copier récursivement des répertoires

enter image description here

Vous pouvez l'obtenir ici

5
nachoparker

L'utilisation d'un outil comme mc (commandant de minuit) peut être une bonne option alternative à d'autres réponses.

Il s'agit d'un simple gestionnaire de fichiers qui vous montre la progression de la copie/du déplacement.

4
jseals

Cet outil est une commande utilitaire Linux qui recherche les commandes de base de coreutils (cp, mv, dd, tar, gzip/gunzip, cat, etc.) en cours d'exécution sur votre système et affiche le pourcentage de données copiées:

https://github.com/Xfennec/cv

3
saidi

Je viens d'avoir un cas où cp a été plus ou moins bloqué en raison d'un bogue de fusible dans le système de fichiers de réception.

Si vous ne pouvez pas simplement passer de cp (c'est-à-dire parce que --sparse = toujours) et que vous voulez quelque chose qui est réellement fiable pour progresser, allez via/proc.

Every 2.0s: cat /proc/20977/io                                                      Thu Sep 28 04:08:57 2017

rchar: 268573800
wchar: 268500992
syscr: 4112
syscw: 4097
read_bytes: 268697600
write_bytes: 0
cancelled_write_bytes: 0
2
Florian Heigl

Utilisez rsync. Cependant, rsync --info=progress2 source dest produit une erreur skipping directory source. Vous devez ajouter un -r ou -a option, ou similaire, pour résoudre ce problème. Je recommande -a et en ajoutant également --stats pour afficher un bon résumé de sortie à la fin. Enfin, ajoutez time devant pour voir combien de temps le processus total a pris.

Alors, faites ceci à la place:

time rsync -a --info=progress2 --stats source destination 

En utilisant cette commande, je viens de dupliquer un répertoire de 42 Go dans un lecteur SSD rapide en ~ 2,5 minutes! Incroyable!

Voici la sortie. Notez que le temps "réel" de cette exécution a été de 2,798 secondes. C'est parce que j'ai oublié d'utiliser time lors de la première exécution où il a réellement fait la copie, c'est donc à quoi ressemble la sortie lorsque tout est déjà le même en source et en destination.

$ time rsync -a --info=progress2 --stats mydir mydir_copy
              0   0%    0.00kB/s    0:00:00 (xfr#0, to-chk=0/289187)   

Number of files: 289,187 (reg: 266,595, dir: 22,580, link: 12)
Number of created files: 0
Number of deleted files: 0
Number of regular files transferred: 0
Total file size: 48,621,942,935 bytes
Total transferred file size: 0 bytes
Literal data: 0 bytes
Matched data: 0 bytes
File list size: 2,096,688
File list generation time: 0.017 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 11,036,784
Total bytes received: 24,420

sent 11,036,784 bytes  received 24,420 bytes  4,424,481.60 bytes/sec
total size is 48,621,942,935  speedup is 4,395.72

real    0m2.798s
user    0m1.115s
sys 0m1.935s

MISE À JOUR:

Voici à quoi cela ressemble de faire une copie complète d'un dossier de 48 Go. Cela a pris 3 min 13.408 sec!

$ time rsync -a --info=progress2 --stats mydir mydir_bak
 48,621,942,066  99%  239.88MB/s    0:03:13 (xfr#266595, to-chk=0/289188)   

Number of files: 289,188 (reg: 266,595, dir: 22,581, link: 12)
Number of created files: 289,188 (reg: 266,595, dir: 22,581, link: 12)
Number of deleted files: 0
Number of regular files transferred: 266,595
Total file size: 48,621,942,935 bytes
Total transferred file size: 48,621,942,066 bytes
Literal data: 48,621,942,066 bytes
Matched data: 0 bytes
File list size: 12,515,323
File list generation time: 0.034 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 48,656,219,349
Total bytes received: 5,209,801

sent 48,656,219,349 bytes  received 5,209,801 bytes  251,480,254.01 bytes/sec
total size is 48,621,942,935  speedup is 1.00

real    3m13.408s
user    2m40.937s
sys 1m0.627s

En relation:

  1. Description détaillée et exemples de nombreuses façons d'utiliser rsync, y compris la mise en miroir (avec suppression non seulement l'ajout de fichiers): https: // superuser .com/questions/1271882/convert-ntfs-partition-to-ext4-comment-copier-les-données/1464264 # 1464264
1
Gabriel Staples

VCP - copier des fichiers dans une interface curses (Afficher la barre de progression sous Linux).

DESCRIPTION: vcp copie les fichiers et les répertoires dans une interface curses, avec une sortie texte uniquement disponible. ses options et sa sortie sont similaires au cp de BSD tout en ajoutant de nouvelles fonctionnalités.

Il fournit des informations sur:

  • fichiers copiés et laissés pour copier
  • données écrites et taille totale des données
  • données écrites chaque seconde
  • deux barres d'état, l'une indiquant l'état actuel du fichier, l'autre l'état total (sauf avec 1 fichier, les deux affichent l'état actuel) et le pourcentage

lorsque la sortie est envoyée à la console:

  • une barre d'état
  • taille copiée et vitesse

Page de manuel VCP: https://linux.die.net/man/1/vcp

Téléchargez vcp-2.2.tar.gz à partir de:

http://distfiles.gentoo.org/distfiles/vcp-2.2.tar.gz

Dépendance: curses.h (libncurses-dev).

Sur Ubuntu, installez:

Sudo apt-get install libncurses-dev

ou

Sudo apt-get install libncurses5-dev

INSTALLER vcp:

make && make install

Manuel:

man vcp
1
user350351