Sinon, existe-t-il un autre utilitaire de ligne de commande capable d’atteindre cet objectif?
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 DoR 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.
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)
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
.
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.
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
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)
...
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)
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.
Alors que pv
peut traiter des tâches locales cp
name__, l'utilisation de dd
avec pv
peut traiter à la fois des tâches locales (cp
name__) et distantes (scp
name__).
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.
Alors que scp
peut à peine montrer l'avancement actuel, utiliser dd
avec pv
est un jeu d'enfant.
ssh onemach@myotherhost dd if=path/to/source.mkv | pv -s 100M | dd of=path/to/dest.mkv
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
):
Voyez la taille du fichier et rappelez-vous
Commencer à copier
Ouvrir un autre terminal
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.
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").
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.
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% [===============================> ]
une option supplémentaire pour préserver les attributs pourrait être (si source
est un dossier, il sera créé dans destination
name__)
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>
à pv
name__.
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
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] [ <=> ]
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.