Comment puis-je déplacer des fichiers et afficher la progression (avec une barre de progression, par exemple)?

118

Lorsque vous déplacez des répertoires volumineux mv, existe-t-il un moyen de visualiser la progression (%)? La cpcommande sur gentoo avait un -gcommutateur qui indiquait la progression.

Letronje
la source
3
Mesurer le débit des tubes dans le shell peut aider, mais je ne sais pas s'il est possible d'utiliser facilement ces outils lors du déplacement d'un fichier
Michael Mrozek

Réponses:

50

Vous pouvez créer un correctif cp et mv qui prennent en charge le commutateur -g pour afficher les progrès. Il y a des instructions et des correctifs sur cette page . Cependant : la page vous demande de faire

$ sudo cp src/cp /usr/bin/cp
$ sudo cp src/mv /usr/bin/mv

qui écrase l'original cp et mv. Cela a deux inconvénients: premièrement, si un paquet coreutils mis à jour arrive sur votre système, il est écrasé. Deuxièmement, si la version corrigée a un problème, ils risquent de casser des scripts reposant sur les protocoles standard cp et mv. Je préférerais faire quelque chose comme ça:

$ sudo cp src/cp /usr/local/bin/cpg
$ sudo cp src/mv /usr/local/bin/mvg

qui copie les fichiers dans / usr / local / bin qui est destiné aux programmes compilés par l’utilisateur et leur donne un nom différent. Donc, quand vous voulez une barre de progression, vous dites mvg -g bigfile /mnt/backupet utilisez mv normalement.

Aussi, vous pouvez faire, alias mvg="/usr/local/mvg -g"il vous suffit de dire mvg bigfile /mnt/backupet d'obtenir directement la barre de progression.

fschmitt
la source
2
Malheureusement, le correctif sur “cette page” n'est plus présent et ne semble pas avoir été indexé dans les archives Web. Il semble y avoir beaucoup de correctifs avec un nom et une fonction similaires . Pourriez-vous modifier votre réponse afin de préciser lequel vous voulez dire?
Gilles
Je pense que github.com/atdt/advcpmv est un successeur valide et qu'il comporte le même correctif. J'ai donc modifié le lien pour le désigner .
fschmitt
93

Je n'aime pas l'idée de remplacer les fichiers binaires de Coreutil lorsqu'il existe des solutions plus simples. Voici donc les miennes:

rsync : Rsync copie les fichiers et dispose d'un -Pcommutateur pour une barre de progression. Donc, si vous avez installé rsync, vous pouvez utiliser un simple alias dans le fichier dot de votre shell:

alias cp='rsync -aP'

L'inconvénient est que rsync est un peu plus lent que cp, mais vous devriez le mesurer avec le temps et décider vous-même, je peux vivre avec :-)

Script shell : Un script shell peut également créer la barre de progression. J'ai trouvé cela il y a quelque temps sur le net et je ne me souviens pas de la source:

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

bar :

'bar' - 'cat' avec barre de progression ASCII

barest un petit script shell permettant d'afficher une barre de processus pour tout type d'opération (cp, tar, etc.). Vous pouvez trouver des exemples sur la page d'accueil du projet.

C'est aussi écrit pour le bourne shell, donc il passera partout.

echox
la source
3
barne pas emballer mvencore.
Tobu
5
Crédit pour le script shell
Lamnk
1
Notez que rsynccela ne remplace pas mvcomplètement (l'OP demande), en particulier lorsqu'il s'agit de copies rapides sur des systèmes de fichiers de type copie sur écriture, par exemple btrfs.
Karl Richter
74

Il existe un nouvel outil appelé progressqui peut trouver n’importe quel descripteur associé à une commande en cours et afficher la progression et la vitesse: disponible ici

progress -w

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

Naugtur
la source
3
WOW, je ne m'attendais pas à ce que ce soit si génial! J'ai simplement tapé progressaprès l'installation et cela m'a présenté l'état d'avancement de la mvcommande que j'attendais actuellement. Merci!
jredd
3
Merci! Lorsque vous déplacez des éléments en tant que racine, il semble que vous deviez utiliser sudo(le même utilisateur, je suppose) - vous pouvez également utiliser watchpour dire ce qui se passe toutes les 2 secondes:watch progress -w
Wilf
6
Programme génial, mais lors du déplacement, par exemple, d'un dossier contenant de nombreux fichiers, il affiche uniquement la progression du fichier actuel, pas le dossier complet au total. Au lieu de cela, watch progress -wvous pouvez également simplement utiliserprogress -m
mxmlnkn
6
IMHO, c'est le moyen le plus unix de résoudre le problème. Au lieu d'appliquer des correctifs sur coreutils ou d'utiliser des outils qui ne sont pas conçus à des fins spécifiques (telles que rsync pour mv) ou d'écrire des scripts surchargés, utilisez simplement cet outil écrit avec amour pour le sujet.
Chagrin
34

Vous pouvez utiliser la commande pipe viewerpv pour afficher la barre de progression:

pv /original/file > /new/file

J'utilise souvent cela pour copier un gros fichier sur un système de fichiers réseau monté (combiner avec gzipet tar). L'inconvénient est que vous ne pouvez copier qu'un seul fichier et non un répertoire. Et vous devez donner un nom au nouveau fichier. Vous ne pouvez pas simplement donner le répertoire de destination comme le cpfait le fichier . Cependant, la copie n'est pas pvun but. C'est un outil puissant qui fait bien plus que copier un fichier. Voir la page d'accueil pour plus d'exemples de pv.

Une bien meilleure option consiste à utiliser rsync -aP. Si vous préférez mv, ajoutez le drapeau --remove-source-files. Ajoutez ceci à votre .bashrcsi vous voulez utiliser les commandes fréquemment:

alias rscp='rsync -aP'
alias rsmv='rsync -aP --remove-source-files'

L'inconvénient est que rsync ne montre que la progression, pas une barre de progression.

Lamnk
la source
tar cf - source-dir | pv | tar xf - -C out-dirvous donnera le débit de tout un répertoire. Si vous connaissez la taille et passez -sà pv, cela peut aussi vous faire progresser.
arantius
6

Si votre objectif est de déplacer / copier un répertoire avec une barre de progression, tout en évitant les interfaces graphiques non terminaux, mc (Midnight Commander) est un bon choix.

Christian Madsen
la source
3

Ma solution est d'utiliser rsync. Il peut copier des répertoires, supprimer les fichiers source après une copie réussie (et donc les "déplacer") et afficher des rapports d'avancement, parmi de nombreuses autres fonctionnalités (notamment la synchronisation des répertoires partiellement copiés et le travail sur le réseau.)

Voici comment déplacer un répertoire avec rsync, avec rapport de progression:

rsync -aP --remove-source-files $src $dst && rm -r $src

Assurez-vous $srcque rien ne se termine par une barre oblique inverse, sinon vous obtiendrez une signification différente de celle de GNU cp.

Le rm -rà la fin est nécessaire car --remove-source-filesne supprime que les fichiers source, une fois que chacun est copié avec succès, pas les répertoires. Le &&fait que l'exécuter que si rsync se termine avec succès. Si vous êtes paranoïaque, vous pouvez le remplacer par une sorte de récursif rmdir, tel quefind $src -d -exec rmdir {} +

Le seul problème est que l' -Poption indique la progression pour chaque fichier, pas pour l'opération de copie complète. Cela peut être inutile si vous essayez de déplacer un répertoire contenant de nombreux fichiers minuscules. La dernière version de développement de rsync comporte un indicateur alternatif --info=progress2indiquant les progrès réalisés pour l'ensemble de l'opération.

Tobia
la source
2

Pour éviter le correctif coreutil auquel ajouter une barre de progression mvet cp, gcp(CoPier de Goffi) est une nouvelle alternative: http://wiki.goffi.org/wiki/Gcp/en

À utiliser de la même manière cpqu'avec les options -rde récursivité et -vde verbosité.

Il utilise une file d'attente de fichiers lorsque plusieurs commandes sont appelées simultanément. Il permet également d’enregistrer les noms de fichiers copiés dans un journal. Pour plus d’informations, reportez-vous à la section relative à la page de manuel relative à l’ enregistrement des sources .

Voici un bon tutoriel pour commencer gcp: http://mylinuxbook.com/gcp-advanced-command-line-file-copier-inspired-by-cp/

Yves Martin
la source
Existe-t-il un gmv comme gcp pour cp?
CodyChan
Je n'ai trouvé aucun équivalent. Soit dit en passant, la barre de progression n’est pas nécessaire lorsqu’on exécute "mv" sur un seul système de fichiers ... c’est assez rapide. Si le déplacement est effectué sur deux systèmes de fichiers différents, il est implémenté en tant que cp, puis supprime source en cas de succès ou supprime la cible en cas d'échec. Un simple script shell basé sur gcp peut le faire correctement (avec une première vérification pour savoir si la source et la cible se trouvent vraiment sur des systèmes de fichiers différents)
Yves Martin
2

Tout d'abord: je ne copie jamais de gros fichiers sans utiliser ionice, à moins que je sache que je ne souhaite pas utiliser l'ordinateur pendant une demi-heure ou plus.

Deuxièmement: toutes mes partitions sont journalières, la copie intrapartition ne prend pas de temps. Si c'est une longue copie, je fais un du -smsur les fichiers et df -m | grep copy_to_partition. Ensuite, si vous êtes curieux de savoir combien de temps il faudra encore, je dfrecommence et vois combien de fichiers ont été copiés.

HandyGandy
la source
Souhaitez-vous partager vos conseils Ionice? quelle priorité donneriez-vous à mv cpu-sise et au disque i / s-sage? Voici mes réglages mais la charge du processeur est toujours élevée même après renicing: imgur.com/a/DLMJplz
ychaouche
2

J'aime utiliser gcp sur ceci ou sur la solution curl (ce qui est vraiment agréable)

gcp SOURCE DESTINATION

Vous pourriez avoir besoin de l'installer sudo apt-get install gcp

Et une très belle et excellente tâche pour la barre de progression avec des informations sur

  • % Total
  • % Reçu
  • % Xferd
  • DL moyen
  • Téléchargement rapide
  • Temps restant
  • Temps passé
  • Temps total
  • Vitesse actuelle

dans un format lisible est:

curl -o DESTINATION FILE://source

En outre, vous devrez peut-être d'abord l'installer sudo apt-get install curl

Le pentadactyle
la source
gcpne prend pas en charge le déplacement de fichier, c.-à-d. que les fichiers source doivent être supprimés manuellement après la copie.
Karl Richter
2

Cela ne vous donne pas une barre de progression, mais appuyez sur CTRL-Tet vous enverrez un SIGINFOà mv, qui indiquera le fichier sur lequel le travail est en cours et le déroulement du processus. Très pratique d'avoir ceci pour les transferts de fichiers volumineux, peut-être moins utile pour un transfert avec de nombreux petits fichiers.

Exemple rapide:

mv 135/61 /Volumes/Jules/135/
# hit C-t
load: 1.08  cmd: cp 35470 uninterruptible 0.00u 0.04s
135/61/1/1-s2.0-S006738-main.pdf -> /Volumes/Jules/135/61/1/1-s2.0-S006738-main.pdf  68%
Charles
la source
1
Cela n'a pas fonctionné pour moi: je INFO: unknown signal; killall -l lists signals. pense que SIGINFO ne concerne que certains BSD, pas le POSIX standard.
Brian Minton
2
Droite. Cela fonctionne sous Mac OS X, mais probablement pas sous Ubuntu.
Charles
1

Permet mv -vd’imprimer une ligne par fichier déplacé et pv -ld’imprimer la progression en fonction du nombre de lignes (nombre de fichiers effectif).

Vous aurez besoin pv(lecteur de pipe): http://www.ivarch.com/programs/pv.shtml

mv -v sourcedir targetdir | pv -l -s filecount > logfile

Utilisez la commande suivante pour obtenir le nombre de fichiers:

find sourcedir | wc -l

Cette commande affiche les informations de progression en fonction du nombre de fichiers copiés. Cela fonctionne mieux s'il y a beaucoup de fichiers de petite taille. S'il n'y a que quelques fichiers qui sont énormes, vous ne vous amuserez pas beaucoup.

Notez que mvsur la même partition devrait être rapide. mvsur une autre partition serait la même que celle cp source targetsuivie par rm source. Donc, voici deux commandes pour copier des répertoires avec des informations de progression.

pour signaler les progrès en fonction du nombre de fichiers copiés:

cp -av sourcedir targetdir | pv -l -s filecount > logfile

pour signaler la progression en fonction des octets copiés:

tar c sourcedir | pv -s size | tar x -C targetdir

Voir ici pour plus de détails: informations de progression via pv pour la copie du répertoire

lesmana
la source
1

Invariablement, je finis par chercher cette réponse après avoir lancé la commande 'mv', point auquel je ne veux plus la recommencer. Si vous êtes dans cette situation, un moyen très simple de surveiller les progrès (ou de voir si c'est assez loin pour que ça ne vaille pas la peine d'être tué) est de courir:

du -hs /directory/you're/moving/data/to

Ceci imprimera simplement la taille du répertoire afin que vous puissiez voir combien de données ont été copiées, ou vous pouvez l'exécuter plusieurs fois pour voir à quelle vitesse les données sont transférées.

qazmonk
la source