Est-il préférable de toujours copier et supprimer, plutôt que de déplacer?

18

De manière générale, je suis pris de panique quand je me rends compte que si j'annule un déplacement de fichier, cela pourrait rendre la cible ou la source incomplète. Cette question s'applique aux plates-formes Windows et Unix. Je ne me souviens jamais exactement comment fonctionne la commande move dans les deux cas. Par exemple, si vous déplacez un répertoire; copie-t-il tout le répertoire, puis le supprime-t-il après, ou copie-t-il puis supprime-t-il chaque fichier individuellement?

Je me rends toujours compte, après avoir tapé quelque chose comme mv verybigdir dest, que j'aurais peut-être dû taper cp -R verybigdir dest  &&  rm -R verybigdir(où l' &&opérateur passe à la commande suivante uniquement si la première a réussi) - ou est-ce inutile? Que se passe-t-il exactement lorsque j'appuie sur Ctrl+ à Cmi-chemin d'un mouvement? De même, que se passe-t-il exactement sous Windows lorsque j'appuie sur le bouton Annuler?

Je ne peux pas compter le nombre de fois où j'ai déplacé quelque chose (la dernière fois lors de l'utilisation svn) et j'ai eu deux répertoires, avec un contenu divisé. Je suppose que la réponse est difficile, car toutes les applications ne déplacent pas des groupes de fichiers de la même manière.

Nick Bolton
la source
16
Quoi que vous fassiez, ne supprimez pas d'abord.
mtone
@monotone Hilarious +1
Nick Bolton

Réponses:

10

Sous Windows, le déplacement vers le même lecteur et la même partition agira exactement comme la commande mv d'Unix et renommera le dossier ou changera son parent. Cependant, si vous deviez le déplacer vers un autre pilote ou partition, il copierait et supprimerait fichier par fichier, d'où la raison pour laquelle il est plus efficace d'utiliser un fichier tar ou un fichier zip sans compression pour déplacer plus rapidement les fichiers sur les partitions et les disques durs. . Si vous l'annuliez, il s'arrêterait simplement là où il se trouve. Je pense que la même chose est vraie pour Unix mais je n'ai pas suffisamment expérimenté avec pour être sûr à 100%. Il s'agit simplement de changer l'inode, mais s'il se trouve sur une autre partition ou lecteur, il doit être copié dans les secteurs de cette partition ou lecteur. Si vous deviez l'annuler pendant le transfert, il aurait déjà déplacé certains fichiers et le fichier en cours de transfert le verra '

Mise à jour: si vous deviez annuler un déménagement et que vous vouliez le reprendre, il vous suffit de relancer l'ordre de déplacement. Cela peut vous avertir que le dossier de destination existe déjà, mais les fichiers ne seront pas écrasés (sauf s'ils existaient avant le déplacement d'origine ou s'ils ont été ajoutés entre les deux ordres de déplacement) car dès qu'ils sont transférés, ils sont supprimés de la source (si sur une partition ou un lecteur différent).

Loup
la source
Ah, je n'avais pas pensé à la compression.
Nick Bolton
Vous n'avez pas vraiment besoin de compresser, ce qui peut prendre beaucoup de temps. Parfois, un niveau de compression de 0 (stockage) peut faire le travail pour déplacer de gros dossiers sur des disques beaucoup plus rapidement.
Wolf
"Sous Windows, le déplacement vers le même lecteur et la même partition agira exactement comme la commande mv d'Unix et renommera le dossier ou changera son parent." - Lorsque vous utilisez l'Explorateur Windows, ce n'est pas vrai. Cela fait beaucoup de conneries, cela prend des siècles, et vous pouvez vous retrouver avec du contenu divisé en deux répertoires, voir cette réponse à une de mes questions .
maaartinus
@maaartinus En fait, la façon dont fonctionne l'Explorateur Windows est de creuser récursivement dans les dossiers plutôt que de changer le nœud parent. Vous avez raison cependant pour Windows Explorer, ce n'est pas seulement un mouvement atomique. J'ai supposé que la ligne de commande était utilisée, j'aurais dû demander.
Wolf
11

Même sur un ordinateur parfaitement stable qui ne tombe jamais en panne: si vous vous souciez des horodatages, mvc'est mieux que simple cp.

( cp -aconservera les horodatages pour vous, et je suppose que quelque chose de similaire existe sous Windows).

Arjan
la source
1
Aha, horodatages. Je n'avais pas pensé à ça! +1
Nick Bolton
Les horodatages sont-ils même importants, honnêtement ...
Marcin
1
@Marcin, ils sont là pour une raison, si c'est ce que vous demandez ...
macek
10

Non.

Explication:

mv verybigdir dest

renomme verybigdir en dest. Il s'agit d'une opération atomique, c'est-à-dire qu'elle ne peut pas échouer à mi-parcours.

Si dest se trouve sur un autre appareil, mv copiera d'abord, puis supprimera l'ancienne version. Ce n'est pas une opération atomique. S'il échoue, vous ne pouvez avoir qu'une copie partielle de verybigdir dans dest, mais verybigdir sera toujours complet.

Oui, d'autres applications peuvent déplacer des fichiers différemment.

Timo Stamm
la source
2
En fait, je pense que mv sur Linux copie / supprime chaque fichier ou répertoire individuellement, plutôt que de copier l'arborescence entière vers la destination puis de supprimer l'arborescence entière de la source ... donc si vous annulez à mi-parcours, vous vous retrouverez avec certains fichiers aux deux endroits, et aucun des répertoires ne sera complet.
voler le
3
@rob: Non. Les répertoires sont des fichiers comme les autres et sont traités de la même manière. Le comportement dont vous parlez est atteint mv verybigdir/* dest.
dmckee du
2
Fondamentalement, mv gère chaque argument d'une manière "cp && rm" ... mv verybigdir/* destdivise le mv de verybigdir en de nombreuses opérations de déplacement distinctes. Rappelez-vous toujours que contrairement à Windows, un programme / outil Linux ne voit pas que "*" là, il est développé par le shell.
Jürgen A. Erhard
4

Sur Windows, je copie et supprime toujours au lieu de déplacer. J'étais en train de déplacer des fichiers et c'est là que j'ai remarqué pour la première fois un mauvais bâton de mémoire. Lors du déplacement du fichier, il s'est arrêté entre les deux et j'ai reçu une erreur, j'ai donc vérifié le dossier source et le fichier était parti, puis j'ai vérifié la destination et il y avait un fichier corrompu. Cela s'est produit plus fréquemment avec des fichiers de plus grande taille et la plupart d'entre eux étaient des téléchargements qui ont pris des heures, donc je recommande de copier puis de supprimer. Gagnez du temps au début, cela sera payant à la fin.

à.
la source
3

Sous Unix, lors de déplacements qui ne dépassent pas les limites du système de fichiers, mvne copie pas les données: il met simplement à jour la base de données inode dans divers répertoires. C'est beaucoup plus rapide que cpsur les gros fichiers.

De plus, l'utilisation mvau-delà des limites du système de fichiers appelle simplement un mécanisme de copie et de suppression.

Je pense donc que vous devriez préférer mv.

dmckee
la source
Joliment résumé.
Nick Bolton
"un mécanisme de copie et de suppression" pourrait être interprété comme "copiez chaque fichier, puis supprimez-le" ou "copiez tous les fichiers, puis supprimez-les tous".
j_random_hacker
2

Dans Windows, au moins, déplacer est tout simplement une copie et une suppression plus automatisées. Je crois que mv déplace chaque fichier individuellement, ce qui signifie que ^ c-ing ne perdra aucun fichier, vous vous retrouverez simplement avec vos fichiers divisés en deux endroits - contrairement à l'Explorateur Windows, qui supprimera tout tout lorsqu'il annulera.

Ma solution est la suivante: ne bougez jamais sauf si je suis sûr de vouloir le déplacer.

Phoshi
la source
1

Si vous utilisez des ACL sur le système de fichiers source, mais pas sur la destination, mv sous Linux copiera la source puis - en raison de l'impossibilité de définir les ACL sur la destination - s'arrêter. Vous finissez donc par avoir le dossier des deux côtés. Il n'y a pas de commutateur en mv pour empêcher ce comportement. Dans ce cas, cp && rm est préférable.

uli42
la source