J'ai un million d'images qui occupent 30 Go d'espace disque qui doivent être déplacés d'un répertoire local vers un autre répertoire local.
Quelle serait la façon la plus efficace de procéder? En utilisant mv
? En utilisant cp
? En utilisant rsync
? Autre chose?
Je dois les prendre:
/path/to/old-img-dir/*
00000000.jpg
--------.jpg ## nearly 1M of them! ##
ZZZZZZZZ.jpg
et déplacez-les ici:
/path/to/new/img/dir/
mv
, en termes de performances, si les répertoires source et cible résident dans le même système de fichiers.Réponses:
rsync
serait un mauvais choix car il fait beaucoup de travail en arrière-plan client / serveur qui tient compte des systèmes locaux et distants.mv
est probablement le meilleur choix. Si possible, vous devriez essayermv directory_old directory_new
plutôt quemv directory_old/* directory_new/
. De cette façon, vous déplacez une chose au lieu d'un million de choses.la source
mv
si nous parlons de millions.mv
met à jour les informations d'inode afin demv directory_old directory_new
fonctionner plus rapidement quemv directory_old/* directory_new
find -print0
avecxargs -0
vous permet d'utiliser des espaces dans les noms.xargs -r
ne fonctionneramv
que s'il y a quelque chose à déplacer. (mv
se plaindra si aucun fichier source n'est fourni).mv -t
vous permet de spécifier d'abord la destination, puis les fichiers source nécessaires àxargs
.Soit dit en passant, je me demanderais si je dois vraiment déplacer une si grande quantité de fichiers à la fois. Le traitement par lots est surévalué. J'essaie de ne pas accumuler d'énormes quantités de travail si je peux traiter les choses au moment où elles sont générées.
la source
Si les deux répertoires résident sur le même système de fichiers, utilisez-
mv
le dans le RÉPERTOIRE et non le contenu du répertoire.S'ils résident sur deux systèmes de fichiers différents, utilisez rsync:
rsync -av /source/directory/ /destination
Remarquez la fuite
/
sur la source. Cela signifie qu'il copiera le CONTENU du répertoire et non le répertoire lui-même. Si vous la laissez/
désactivée, il copiera toujours les fichiers mais ils se trouveront dans un répertoire nommé/destination/directory
. Avec le /, les fichiers seront juste dans/destination
rsync
conservera la propriété des fichiers si vous l'exécutez en tant que root ou si les fichiers vous appartiennent. Il conservera également lemtime
fichier de chaque fichier.la source
rsync
semble tourner en rondmv
. Merci pour le conseil!Lorsque vous utilisez 'cp', chaque fichier fait une ouverture-lecture-fermeture-ouverture-écriture-fermeture. Tar utilise différents processus de lecture et d'écriture ainsi que plusieurs marches pour fonctionner sur plusieurs fichiers à la fois. Même sur un seul boîtier CPU, les applications multithread sont plus rapides.
la source
tar c | tar x
vous obtenez un coût de O (total_size) au lieu de O (file_count).Comme directory_old et directory_new sont sur le même système de fichiers que vous pourriez utiliser
cp -l
au lieu demv
comme option.cp -l
créera un lien dur vers les fichiers d'origine. Lorsque vous avez terminé avec «déplacer» et que vous êtes satisfait du résultat, vous pouvez supprimer ces fichiers de directory_old. en termes de vitesse, ce sera la même chose que «mv» car vous créez d'abord les liens, puis vous supprimez ceux d'origine. Mais cette approche vous permet de recommencer depuis le début si cela a du sensla source
Cela dépend (tm). Si votre système de fichiers est en copie sur écriture, la copie (
cp
oursync
, par exemple) doit être comparable à un déplacement. Mais dans la plupart des cas, move (mv
) sera le plus rapide, car il peut simplement basculer entre les données qui décrivent où un fichier est placé (remarque: cela est trop simplifié).Donc, sur votre installation Linux moyenne, je choisirais
mv
.EDIT: @ Frédéric Hamidi a un bon point dans les commentaires: Ceci n'est valable que s'ils sont tous les deux sur le même système de fichiers et disque. Sinon, les données seront quand même copiées.
la source
Pour copier au moins ~ 10k de fichiers (pas de répertoires), cp s'est plaint de:
La meilleure option est Rsync:
Et cela s'est fait très rapidement!
la source
Si vous disposez de l'espace libre, archivez-les dans un seul fichier .tar (sans compression plus rapide), puis déplacez ce fichier et désarchivez-le.
la source
La nature de la destination déterminerait la manière la plus efficace d'accomplir cette tâche. Supposons que vous êtes sur un système local, le vôtre
PWD
est/
maintenant. et/a
contient les millions d'images. Notre tâche consiste à déplacer toutes les images vers/b
, tout en conservant toute la structure du sous-répertoire. Supposons également/a
et/b
sont des points de montage pour deux partitions différentes, chacune sur un disque connecté localement. Nous voudrions faire cette tâche avec une bâche. Cela peut prendre un certain temps, alors assurez-vous d' utiliserscreen
,tmux
ou vous l' exécuter comme un processus d'arrière - plan.Cela copier tous les fichiers et les répertoires
/a
pour/b
, maintenant , vous aurez besoin de nettoyer/a
une fois que vous le confirmer terminé sans erreur.la source