web-dev-qa-db-fra.com

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

Lors du déplacement de grands répertoires à l'aide de mv, existe-t-il un moyen de visualiser la progression (%)? La commande cp sur gentoo avait un -g commutateur qui a montré la progression.

129
letronje

Vous pouvez créer un cp et un mv corrigés qui prennent ensuite en charge le commutateur -g pour afficher la progression. 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 les cp et mv d'origine. Cela présente deux inconvénients: Premièrement, si un package coreutils mis à jour arrive sur votre système, il est écrasé. Deuxièmement, si la version corrigée a un problème, ils peuvent casser les scripts en s'appuyant sur cp et mv standard. Je préfère 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/backup et utilisez mv normalement.

Vous pouvez également faire alias mvg="/usr/local/mvg -g" alors il suffit de dire mvg bigfile /mnt/backup et obtenez directement la barre de progression.

50
fschmitt

Je n'aime pas l'idée d'écraser les binaires de coreutil quand il existe des solutions plus simples, voici donc la mienne:

rsync : Rsync copie les fichiers et possède un -P passer à une barre de progression. Donc, si vous avez installé rsync, vous pouvez utiliser un simple alias dans votre fichier dot shells:

alias cp='rsync -aP'

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

Script Shell : Un script Shell peut également créer la barre de progression. Je l'ai trouvé 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% [===============================>                      ]

barre :

‘Bar’ - ‘cat’ avec ASCII barre de progression

bar est un petit script Shell pour afficher une barre de processus pour toutes sortes d'opérations (cp, tar, etc.). Vous pouvez trouver des exemples sur la page d'accueil du projet.

Il a également été écrit pour le Bourne Shell, il se déroulera donc à proximité partout.

96
echox

Il existe un nouvel outil appelé progress qui peut trouver n'importe quel descripteur lié à une commande en cours d'exécution et afficher la progression et la vitesse: disponible ici

progress -w

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

92
naugtur

Vous pouvez utiliser visualiseur de tuyaux commande pv pour afficher la barre de progression:

pv /original/file > /new/file

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

Une bien meilleure option consiste à utiliser rsync -aP. Si vous souhaitez mv à la place, ajoutez l'indicateur --remove-source-files. Ajoutez ceci à votre .bashrc si vous souhaitez utiliser fréquemment les commandes:

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

L'inconvénient ici est que rsync affiche uniquement les progrès, pas une barre de progression.

36
Lamnk

Si votre objectif est de déplacer/copier un répertoire avec une barre de progression, mais en évitant l'interface graphique non terminale, mc (Midnight Commander) est un bon choix.

6
Christian Madsen

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

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

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

Assurez-vous que $src Ne pas 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-files Ne supprime que les fichiers source, après que chacun a été copié avec succès, pas les répertoires. Le && S'assure de l'exécuter uniquement si rsync se termine avec succès. Si vous êtes paranoïaque, vous pouvez le remplacer par une sorte de rmdir récursif, comme find $src -d -exec rmdir {} +

Le seul problème est que l'option -P Affiche la progression pour chaque fichier, pas pour toute l'opération de copie. 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 a un indicateur alternatif --info=progress2 Qui indique la progression de l'opération entière.

4
Tobia

Tout d'abord: je ne copie jamais de gros fichiers sans utiliser ionice, sauf si je sais que je ne veux pas utiliser l'ordinateur pendant une demi-heure ou plus.

Deuxièmement: toutes mes partitions sont parcourues afin que la copie intrapartition ne prenne pas de temps. Si c'est une longue copie, je fais un du -sm sur les fichiers et df -m | grep copy_to_partition. Ensuite, si vous êtes curieux de savoir combien de temps cela prendra, je refais le df et je vois combien de fichiers ont été copiés.

2
HandyGandy

Cela ne vous donne pas de barre de progression, mais appuyez sur CTRL-T et vous enverrez un SIGINFO à mv, qui indiquera sur quel fichier il travaille et dans quelle mesure il se trouve dans le processus. Assez pratique pour l'avoir pour les transferts de fichiers volumineux, peut-être pas aussi 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%
2
Charles

Sur ma menthe, j'aime utiliser gcp sur ceci ou la solution curl (qui est vraiment sympa)

gcp SOURCE DESTINATION

Vous devrez peut-être l'installer Sudo apt-get install gcp

Et une tâche très agréable et excellente 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 de Nice est:

curl -o DESTINATION FILE://source

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

2
ThePentadactyl

Pour éviter les correctifs de coreutil, ajouter une barre de progression à mv et cp, gcp (CoPier de Goffi) est une nouvelle alternative: http: //wiki.goffi. org/wiki/Gcp/en

Pour utiliser la même manière que cp avec les options -r pour la récursivité et -v pour la 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, voir la page de manuel Sauvegarde source pour plus de détails.

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

2
Yves Martin

Utilisation mv -v pour imprimer une ligne par fichier déplacé et pv -l pour imprimer la progression en fonction du nombre de lignes (en fait, le nombre de fichiers).

Vous aurez besoin de pv (visualiseur de tuyaux): 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 affichera des informations de progression en fonction du nombre de fichiers copiés. Cela fonctionne mieux s'il y a beaucoup de petits fichiers. S'il n'y a que quelques fichiers qui sont énormes, vous ne vous amuserez pas beaucoup.

Notez que mv sur la même partition doit être rapide. mv vers une autre partition serait identique à cp source target suivi par rm source. Voici donc deux commandes pour copier des répertoires avec des informations de progression.

pour signaler la progression 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

1
lesmana

Invariablement, je finis par chercher cette réponse après Je lance la commande 'mv', auquel cas je ne veux pas la redémarrer. Si vous êtes dans cette situation, un moyen très simple de suivre les progrès (ou de voir si c'est assez loin pour que cela ne vaille pas la peine d'être tué) est d'exécuter:

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

Cela affichera 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.

1
qazmonk

J'utilise le script suivant enregistré avec rsmv nom:

#!/usr/bin/env bash

rsync -aP --remove-source-files "$@" && rm -rf "${@:1:$#-1}"

Il gère plus d'une source et des noms de fichiers avec des espaces:

$ rsmv source1 source2 source\ 3 "source 4" dest
0
mixel