web-dev-qa-db-fra.com

Comment puis-je créer une barre de progression lors de la copie d'un répertoire avec cp?

Je suppose que je pourrais comparer le nombre de fichiers du répertoire source au nombre de fichiers du répertoire cible au fur et à mesure de la progression de cp, ou peut-être le faire plutôt avec la taille du dossier? J'ai essayé de trouver des exemples, mais toutes les barres de progression semblent être écrites pour la copie de fichiers individuels. Je veux copier un tas de fichiers (ou un répertoire, si le premier n'est pas possible).

43
octosquidopus

Vous pouvez également utiliser rsync au lieu de cp comme ceci:

rsync -Pa source destination

Ce qui vous donnera une barre de progression et l'heure estimée d'achèvement. Très utile.

53
SteveLambert

Pour afficher une barre de progression lors d’une copie récursive de fichiers & dossiers & sous-dossiers (y compris les liens et les attributs de fichiers), vous pouvez utiliser gcp (facilement installé dans Ubuntu et Debian en exécutant "Sudo apt-get install gcp"):

gcp -rf SRC DEST

Voici la sortie typique lors de la copie d'un grand dossier de fichiers:

Copying 1.33 GiB  73% |#####################      | 230.19 M/s ETA:  00:00:07

Notez qu’elle affiche une seule barre de progression pour l’ensemble de l’opération. Si vous souhaitez une seule barre de progression par fichier, vous pouvez utiliser rsync:

rsync -ah --progress SRC DEST
22
Shervin Emami

Vous pouvez consulter l'outil vcp. C'est un simple outil de copie avec deux barres de progression: une pour le fichier actuel et une pour l'ensemble. 

MODIFIER

Voici le lien vers les sources: http://members.iinet.net.au/~lynx/vcp/ La page de manuel est disponible ici: http://linux.die.net/ man/1/vcp

La plupart des distributions ont un paquet pour cela.

7
Thomas Berger

Voici une autre solution: Utilisez l'outil bar

Vous pouvez l'invoquer comme ceci:

#!/bin/bash
filesize=$(du -sb ${1} | awk '{ print $1 }')
tar -cf - -C ${1} ./ | bar --size ${filesize} | tar -xf - -C ${2}

Vous devez suivre le chemin sur tar, et ce sera inexact sur les petits fichiers Aussi, vous devez vous assurer que le répertoire cible existe. Mais c'est un moyen.

4
Thomas Berger

Un simple unix way consiste à aller dans le répertoire de destination et à faire watch -n 5 du -s. Peut-être le rendre plus joli en se présentant comme un bar. Cela peut aider dans les environnements où vous n’avez que les utilitaires Unix standard et n’avez aucune possibilité d’installer des fichiers supplémentaires. du-sh est la clé, il suffit de regarder toutes les 5 secondes. Pour : Fonctionne sur tous les systèmes Unix Contre : Pas de barre de progression 

2
Nishant

Mon option préférée est Advanced Copy , car il utilise les fichiers source cp d'origine.

$ wget http://ftp.gnu.org/gnu/coreutils/coreutils-8.21.tar.xz
$ tar xvJf coreutils-8.21.tar.xz
$ cd coreutils-8.21/
$ wget --no-check-certificate https://raw.githubusercontent.com/atdt/advcpmv/master/advcpmv-0.5-8.21.patch
$ patch -p1 -i advcpmv-0.5-8.21.patch
$ ./configure
$ make

Les nouveaux programmes sont maintenant situés dans src/cp et src/mv. Vous pouvez choisir de remplacer vos commandes existantes:

$ Sudo cp src/cp /usr/local/bin/cp
$ Sudo cp src/mv /usr/local/bin/mv
1
elboletaire

Il existe un outil pv pour effectuer cette opération: http://www.ivarch.com/programs/pv.shtml

Il y a une version d'ubuntu dans apt

1
Foo Bah

Que diriez-vous de quelque chose comme

find . -type f | pv -s $(find . -type f | wc -c) | xargs -i cp {} --parents /DEST/$(dirname {})

Il trouve tous les fichiers du répertoire en cours, les acheminant via PV tout en donnant à PV une taille estimée afin que l'indicateur de progression fonctionne, puis en transmettant ces informations à une commande CP avec l'indicateur --parents afin que le chemin DEST corresponde au chemin SRC.

Un problème que je n’ai pas encore résolu est que si vous exécutez cette commande

find /home/user/test -type f | pv -s $(find . -type f | wc -c) | xargs -i cp {} --parents /www/test/$(dirname {})

le chemin de destination devient/www/test/home/utilisateur/test/.... FICHIERS ... et je ne sais pas comment dire à la commande de se débarrasser de la partie "/ home/utilisateur/test". C'est pourquoi je dois l'exécuter depuis le répertoire SRC.

0
Ken Brill

Pour ajouter une autre option, vous pouvez utiliser cpv. Il utilise pv pour imiter l'utilisation de cp

Cela fonctionne comme pv mais vous pouvez l'utiliser pour copier récursivement des répertoires

enter image description here

Vous pouvez l'obtenir ici

0
nachoparker

Vérifiez le code source pour progress_bar dans le dépôt ci-dessous de git du mien

https://github.com/Kiran-Bose/supreme

Essayez également le package de script bash personnalisé supreme pour vérifier le fonctionnement de la barre de progression avec les commandes cp et mv.

Aperçu de la fonctionnalité

(1) Ouvrez Apps ---- 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) Manage USB ---- Déplacer/Copier depuis USB ---- Déplacer/Copier vers USB

0
KIRAN B