Déplacement d'une grande quantité de fichiers (~ 100 000)

13

Je travaille avec des dossiers contenant beaucoup de fichiers, comme 100 000 voire 1 000 000 fichiers par dossier. Lorsque j'essaie de déplacer le contenu d'un dossier dans un autre, mon ordinateur est toujours bloqué. Même lorsque le processus semble terminé, je ne peux voir le contenu d'aucun dossier car nautilus semble complètement figé et je dois forcer mon ordinateur à redémarrer. J'ai remarqué que cela se produit également lorsque j'essaie de déplacer comme 10 000 fichiers.

Est-ce un problème de mon ordinateur ou est-ce normal lorsque vous travaillez avec ces numéros?

Une façon intelligente d'effectuer ce transfert de fichiers?

Hyperion
la source
3
Qu'en est-il de l'utilisation du terminal ( cp -R SRC/ DEST/)
UniversallyUniqueID
2
@BharadwajRaju: Selon les fichiers, cp -a pourrait être meilleur car il préserve les propriétaires, les horodatages et les autorisations. Je recommanderais également rsync car il peut vérifier les transferts et ne copie que les fichiers qui n'existent pas déjà.
Michael
Mise à jour: gvfs-copy(à partir du gvfs-binpackage) peut être plus rapide que cp.
UniversallyUniqueID
Vous avez deux questions ici au lieu d'une. Veuillez consulter la page Comment demander pour obtenir des instructions.
Luís de Sousa

Réponses:

19

Pensez peut-être à utiliser une méthode en ligne de commande pure pour transférer des fichiers de très grandes quantités, vous constaterez sans aucun doute que le processus est beaucoup plus rapide que l'utilisation d'un GUI.

Il existe de nombreuses façons d'accomplir cela, mais les éléments suivants ont fonctionné rapidement, en toute sécurité et efficacement sur mon système:

find . -maxdepth 1 -type f -print0 | xargs -0 mv -t <destination>

Quelques explications pour cette commande:

  1. Votre répertoire d'entrée est le '.' caractère et pour cette commande particulière, vous devez être dans ce répertoire
  2. Votre répertoire de sortie est le <destination>dans mon exemple. Modifiez évidemment cela pour répondre à vos propres besoins et laissez de côté les crochets.
  3. Cette syntaxe permet des noms de fichiers avec des espaces en bonus :)

Des permutations sans fin sont possibles mais cela devrait fonctionner bien et beaucoup plus efficacement que le GUI. Une permutation par exemple: si vous vouliez déplacer uniquement des fichiers pdf, vous pourriez exécuter:

find . -iname "*.pdf" -maxdepth 1 -type f -print0 | xargs -0 mv -t <destination>

L'utilisation de xargsouvre de nombreuses possibilités notamment avec le déplacement d'un si grand nombre de fichiers. Beaucoup, beaucoup de possibilités ....

Problèmes potentiels:

Il y a au moins 2 pièges potentiels à méditer, grâce aux commentateurs ci-dessous pour ces réflexions:

  1. Votre répertoire de destination peut être corrompu, dans un emplacement inaccessible par la suite, mal saisi, etc. mv, y déplacera toujours les fichiers! Faites attention ici ...
  2. Si l' -toption ( --target-directory) est manquante et que le dossier de destination est en fait un fichier, vous déplacerez un fichier et échouerez sur les autres. mva 2 utilisations: renommer la source en destination ou déplacer la source en répertoire . Encore une fois soyez prudent ...
andrew.46
la source
2
Ne ferait pas juste find . -maxdepth 1 -type f -exec mv -t test {} +?
muru
@muru: Merci pour cela, j'ai coupé la -name...pièce étrangère mais je l'ai laissée xargsen place.
andrew.46
2
Je ne sais pas ... Bien que la commande soit évidemment correcte en l'état, je considérerais un mouvement complet un peu trop sujet aux erreurs. (Et si vous, par exemple, oubliez d'inclure l' -tindicateur? Je pense que tous les fichiers seraient "déplacés" vers un seul fichier appelé test, ce qui entraînerait la perte de tous vos fichiers sauf un.) Je pense que je préférerais un rsyncsuivi par, si tout s'est bien passé, a rm. Cependant, je peux imaginer des scénarios où une telle vérification ne peut pas être automatisée.
Jos
@Jos: Merci, j'ai ajouté une note de bas de page décrivant cette possibilité. Agréable de voir un rsync exemple écrit comme réponse?
andrew.46
Linux prend en charge des listes d'arguments extrêmement longues, vous pouvez donc probablement le faire mv dir1/* dir2, et n'y recourir qu'en find -execcas de problème, ou si vous devez éviter de faire correspondre les dossiers avec votre glob. (Bien que cela dépende de vos conventions de dénomination, correspondra souvent *.*à la plupart des fichiers mais pas à la plupart des répertoires, car il est courant d'avoir un .extensionfichier sur et de ne pas en avoir .dans les noms de répertoire)
Peter Cordes
4

J'ai eu une expérience similaire auparavant, c'est normal lorsqu'il s'agit d'un grand nombre de fichiers. J'avais une grande collection de fiches techniques PDF (pièces électroniques).

Les outils GUI vérifient certains détails du fichier et les métadonnées (icône / miniature, taille, ...), ce sera un gros problème dans ce cas. Même en mode Icône et sans vignettes, elles se figent car la plupart d'entre elles ne sont pas conçues pour des cas extrêmes. L'outil GUI essaie de charger les icônes de présentation pour tous les fichiers / dossiers du répertoire, même ces éléments ne sont pas visibles par l'utilisateur dans la partie d'écran actuelle. Le tri fait également partie du problème et aucun moyen de l'éviter.

  • Je finis par diviser des fichiers sur des dossiers séparés en fonction de la marque / modèle moins de 10000 chacun. Peut-être que vous pouvez utiliser la date (comme la plupart des gens le font avec les photos / numérisations) ou la première lettre (comme dans le référentiel de paquets Ubuntu )
  • Il est plus facile d'utiliser des outils CLI à la place, car ils affichent uniquement ce que vous avez demandé. Vous pouvez utiliser locatepour une recherche rapide au lieu de find.
  • Pour l'opération de déplacement, utilisez-le mvdans le terminal (les outils de l'interface graphique sont lents car ils essaient de mettre à jour la vue périodiquement).

    S'il se trouve dans la même partition, la commande ne modifiera que les pointeurs de l'index du système de fichiers. Sinon, ce sera une double opération (copier et supprimer). Ce sera cher.

Il n'y a qu'un seul cas, je peux vous aider, si vous copiez ces fichiers plusieurs fois et qu'ils ne sont pas mis à jour. Comme je l'ai fait lorsque je partage ma collection avec des amis, chaque fois que j'essaie de la copier, cela prend une décennie. (Ceci est plus utile uniquement avec des fichiers de petite taille)

  • Créez un seul package ou quelques packages, comme zip sans / faible compression. Lorsque vous le copiez, il sera plus rapide, alors laissez DMA faire son travail.
user.dz
la source
3

Si vous cherchez une solution qui vous offre les avantages des opérations en ligne de commande avec le sentiment et la flexibilité de l'interface graphique combinés, je recommande mc( commandant de minuit ).

vue mc commander à 2 volets

Il s'agit d'un gestionnaire de fichiers visuel basé sur ncurses - vous avez une vue à deux volets sur vos fichiers et un menu disponible. L'utilisation de la souris est possible, même sur ssh. Vous pouvez parcourir vos fichiers fs, inspecter les fichiers avec la visionneuse de fichiers, filtrer selon les critères à la volée et faire effectuer les opérations de copie ou de déplacement sur la ligne de commande.

C'est un clone du programme DOS Norton Commander qui était populaire au milieu des années 80. Cela fonctionne bien chaque fois que l'interface graphique commence à devenir peu fiable pour moi, et idéale pour votre objectif.

emk2203
la source
0

J'ai rencontré des problèmes quelque peu similaires - je testais ma configuration RAID et lorsque je fais d'énormes transferts (par exemple, plus de 100 000 fichiers et 1-2 To de données en une seule fois), il semble que les transferts démarrent assez rapidement - disons ~ 200 Mo / s, puis ralentissez rapidement jusqu'à un plateau raisonnable ~ 90-120 Mo / sec (éventuellement après avoir consommé un peu de mémoire cache flash sur les disques). Ensuite, après 20-30 minutes, l'opération commence progressivement à descendre à un plateau beaucoup plus bas ~ 30-40 Mo / sec, pire quand il s'agit de petits fichiers - prenant une opération de 4 à 5 heures plus près de 15 heures.

J'ai passé un certain temps à essayer de diagnostiquer - par exemple, d'éventuels défauts de lecteur. En dépit d'essayer différents outils - ligne de commande, nautilus, je ne pouvais pas maintenir un débit décent pour les opérations de copie très volumineuses.

Ce qui a le mieux fonctionné pour moi, c'était d'utiliser Midnight Commander, et chaque fois que la copie devenait lente, je mettais en pause l'opération jusqu'à ce que le voyant du disque dur s'éteigne après que toutes les opérations en attente se soient éteintes - généralement une minute environ - puis une nouvelle pause MC et il reviendrait à un rythme décent pendant 20 à 30 minutes supplémentaires. Plutôt ennuyeux cependant.

M Szil
la source