Existe-t-il une différence entre mv et {cp + rm l'ancien fichier} sous Unix?


13
  • mv a b

  • cp a b;rm a

Ce sont deux ensembles de déclarations. Y a-t-il une différence entre ce qu'ils font?


1
atomicité? Je ne sais pas vraiment si la commande mv est atomique.
Adriano Varoli Piazza

Oui. Pourquoi demandez-vous?

1
Maintenant, mvest similaire à ln+ rm, cependant, le premier fonctionnera pour les mouvements entre systèmes de fichiers (qui devient alors juste cp+ rm), tandis que le dernier échouera à ln(qui ne prend pas en charge les liens durs entre systèmes de fichiers).
Chris Jester-Young

Chaque jour est une journée d'école - pour tous ceux qui se demandent comment contourner ce comportement par défaut, vous avez besoin du --remove-destinationcommutateur - stackoverflow.com/a/9371263/409638
robert

Réponses:


20

En supposant que les fichiers impliqués se trouvent sur le même système de fichiers, mv modifie simplement les pointeurs dans le système de fichiers, tandis que cp copie l'intégralité du contenu du fichier et rm modifie à nouveau les pointeurs. Donc, mv est beaucoup plus efficace.


mais ils font exactement la même chose, non?
Lazer

8
Non, ils ne le font pas.

2
@eSKay: Non. Deux scénarios: 1. La cible n'existe pas. mvrenomme simplement le fichier (même inode que le fichier d'origine). cpcrée un nouvel inode pour le nouveau fichier. 2. La cible existe. mvdissocie (supprime) le fichier cible et renomme en une seule étape. cpécrase l'inode du fichier cible.
Chris Jester-Young

7
De plus, mvne change jamais la permission ou la propriété. Imaginez que vous souhaitiez déplacer un fichier du homedir de votre ami vers votre propre homedir. Si vous mvle faites, vous vous retrouverez avec un fichier dans votre homedir qui appartient à votre copain. Vous ne pouvez pas chownou chmodet selon les autorisations ne pas même le modifier ou le lire. Si vous ne cpsuiviez par rmle fichier appartiendra à vous et tout va bien.
Ludwig Weinzierl

9

Oui, mv a une chance d'être atomique sur le même disque, alors que la combinaison de cp et rm ne l'a jamais été.

Cela suppose que mv est implémenté en utilisant rename(), qui est l'appel qui a la garantie. Voir, par exemple, cet article de newsgroup , qui cite POSIX:

Cette fonction rename () est équivalente pour les fichiers normaux à celle définie par la norme ISO C. Son inclusion ici étend cette définition pour inclure des actions sur les répertoires et spécifie le comportement lorsque le nouveau paramètre nomme un fichier qui existe déjà. Cette spécification nécessite que l'action de la fonction soit atomique.


7

Sur le même système de fichiers, mv modifie la référence du répertoire, pointant vers le même inode (données de fichier et métadonnées) ainsi:

  • est une opération atomique (elle ne peut pas être interrompue par une autre opération de fichier de processus)
  • prend seulement une quantité insignifiante d'espace disque supplémentaire (le nom supplémentaire dans le répertoire)
  • préserve les autorisations et la propriété des fichiers
  • peut être beaucoup plus rapide, selon la quantité de données

Copier et supprimer

  • n'est pas atomique (un autre processus pourrait interférer entre les commandes cp et rm)
  • nécessite de stocker les données du fichier deux fois sur le disque pendant une courte période (entre les commandes cp et rm)
  • modifie les autorisations et la propriété des fichiers par défaut
  • peut être beaucoup plus lent ou même échouer, selon la quantité de données

4

Lorsque la source et la destination sont sur le même volume physique, la première approche consiste simplement à renommer et est très rapide (même si le ou les fichiers sont très volumineux).

cp& rmdevra toujours charger / stocker toutes les données, même si cela n'était pas nécessaire.


3

mv est essentiellement une opération de "renommage". Cela signifie que le fichier lui-même est laissé au même endroit sur le disque. Aucune opération de fichier réelle n'est effectuée.


2

Oui.

mv modifie simplement les métadonnées du système de fichiers sur le fichier en fonction de son nom et de son emplacement, tandis que cp crée une copie séparée du fichier, ce qui prend beaucoup plus de temps car il doit lire entièrement le premier fichier, puis écrire son contenu dans un autre fichier


2

cp et rm sont beaucoup plus lourds sur l'utilisation du disque et peuvent échouer pour des raisons d'espace disque.


2

La différence est que mv conserve les attributs de fichier alors que cp par défaut ne le fait pas, par exemple en définissant la date de création à la date actuelle.

Pour remplacer cette valeur par défaut, utilisez "cp -p" pour conserver la dernière modification des données, l'heure du dernier accès, l'ID utilisateur et l'ID de groupe (uniquement s'il est autorisé à le faire), les bits d'autorisation de fichier et le SUID et le SGID morceaux.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.