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.
rsync
a un drapeau appelé progress2
qui indique le pourcentage global:
rsync --info=progress2 source dest
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
rsync
fonctionne le mieux pour montrer la progression pendant la progression de la copie.
ex:
rsync -avh --progress sourceDirectory destinationDirectory
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.
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
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 %
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.
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.
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 - )
;}
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)
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.
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
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
Vous pouvez l'obtenir ici
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.
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:
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
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
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
make && make install
man vcp