mv
et rsync
ne sont pas des programmes similaires. En particulier, mv
tente souvent de simplement renommer des objets. S'il se trouve dans le même système de fichiers, il ne copie pas du tout le contenu.
Si vous n'aviez pas déjà imperative_PLs/fortran
, puis mv
prendrait le fortran
existant répertoire et renommez-le à cet endroit dans l'arborescence.
Mais vous avez déjà un répertoire (avec du contenu) à cet emplacement. Étant donné qu'un nom ne peut référencer qu'un seul objet, le répertoire existant doit être soit supprimé, soit renommé. mv
suppose que vous ne voulez faire ni l'un ni l'autre et abandonne.
rsync
copie à la place les fichiers individuels et autres contenus dans fortran
et les place dans le imperative_PLs/fortran
existant répertoire.
Pensez-y comme rename
à la place, et le comportement peut sembler plus compréhensible.
mv
est en fait rename
sous la couverture.
Si vous déplacez un fichier vers un autre fichier, mv
suppose que vous savez ce que vous faites et écrasez le fichier de destination.
Si vous déplacez un répertoire vers un autre répertoire, mv
suppose que vous souhaitez conserver le nom de base de votre répertoire d'origine et le créer dans le répertoire cible. S'il n'y a pas encore de répertoire portant ce nom côté destination, ou si un répertoire portant ce nom existe mais est vide, l'opération réussit.
Cependant, si le répertoire cible existe déjà et n'est pas vide, ce n'est plus un rename
mais cela devrait être une suppression récursive de fichiers et de répertoires. rename
n'est pas conçu pour le faire donc il échoue, mv
ne va pas plus loin car il suppose que vous ne vouliez pas le faire et échoue également.
-
mv
ne fonctionne pas dans ce cas car il n'a pas été conçu pour le faire. Les appels système sont (probablement) soit- Déplacer vers le même système de fichiers :
rename
(à l'originelink
etunlink
) - Déplacement entre les systèmes de fichiers :copie de fichier récursive suivie de
unlink
récursif
- Déplacer vers le même système de fichiers :
-
Opinion :Je pense que ce n'est pas tant qu'il a été conçu pas fonctionner, car il n'a pas été conçu pour gérer ce cas d'utilisation. Pour un outil "simple" destiné à bien faire une chose, vous devez fournir un ensemble de commutateurs à indiquer à
mv
lequel de ces chemins d'action à prendre :- Pour renflouer avec une erreur, comme dans l'implémentation actuelle
- Pour fusionner, renflouer avec une erreur si un fichier existe déjà
- Pour fusionner, en remplaçant tous les fichiers cibles qui existent déjà
Si l'action de fusion/remplacement est ce que vous voulez, vous pouvez l'implémenter assez facilement avec cp
suivi de rm
, ou en utilisant l'un des utilitaires de copie d'arborescence de fichiers tar
, pax
, etc.