J'ai une tonne de fichiers et répertoires dans un sous-répertoire que je veux déplacer dans le répertoire parent. Il y a déjà quelques fichiers et répertoires dans le répertoire cible qui doivent être écrasés. Les fichiers uniquement présents dans la cible doivent rester intacts. Puis-je forcer mv
à faire ça? Il se mv * ..
plaint
mv: cannot move `xyz' to `../xyz': Directory not empty
Qu'est-ce que je rate?
shell
command-line
rename
EricSchaefer
la source
la source
mv -f
?mv -f
la réponse n'est pas correcte.Réponses:
Vous devrez les copier vers la destination, puis supprimer la source, en utilisant les commandes
cp -r * ..
suivies derm -rf *
.Je ne pense pas que vous puissiez "fusionner" des répertoires en utilisant
mv
.la source
mv
c'est plus rapide parce que vous êtes sur le même système de fichiers? Et si vouscp -l
utilisiez pour créer des liens durs plutôt que de déplacer réellement les fichiers?cp -a
place decp -r
afin de préserver les attributs de fichier (horodatage, autorisations, etc.).cp -rl source destination && rm -r source
.rsync
serait probablement une meilleure option ici. C'est aussi simple quersync -a subdir/ ./
.Mon arbre de test dans
filename
:contents
Format:En cours d'exécution
rsync
:Donne:
Et puis, pour émuler
mv
, vous voudrez probablement supprimer le répertoire source:Donnant:
Si cela est faux, pouvez-vous fournir un exemple similaire (par exemple, utiliser mon arbre de test situé en haut de cette réponse) avec le résultat souhaité?
la source
rm -r
à la fin pour le rendre fondamentalement identique àmv
.mv
est atomique, conserve les numéros d'inode (le fichier peut rester ouvert), et ne prend pas de temps et d'espace pour en faire une copie.cp -r; rm -r
. Je pense que dans ce sens, ilrsync
convient de mentionner aussi.rsync
peut supprimer la source après les copies avec le--remove-source-files
paramètre. Cela devrait être un moyen pratique de faire ce que vous voulez.Du
rsync man page
:la source
cp -r; rm
cause du manque d'espace libre. Au lieu de cela, lesrsync --remove-source-files
deux espaces disque utilisés minimisés ont évité de copier exactement les mêmes fichiers.Vous pouvez le faire avec
cp
etrm
, mais sans copier l’énorme quantité de données que vous essayez (vraisemblablement) d’éviter de transférer. @mattdm a fait allusion à cela dans son commentaire , et une réponse à une autre question comporte une discussion plus complète sur diverses options.Pour l’essentiel, l’
-l
option de lacp
commande crée des liens physiques vers des fichiers plutôt que de copier leurs données dans de nouveaux fichiers.la source
cp -al source destination
pour conserver les informations et les autorisations du propriétaire.cp
écrase par défaut. L'-f
option tente de supprimer le fichier (comme dansrm
) avant de tenter une nouvelle copie, ce qui peut aider si le processus ne peut pas ouvrir le fichier en écriture, bien que certaines personnes préfèrent voir qu'il y a une erreur. Je ne sais pas si cela importait pour le PO, mais j'ai quand même ajouté le-f
drapeau à ma réponse.Voici un script qui déplace les fichiers de dessous
/path/to/source/root
vers le chemin correspondant sous/path/to/destination/root
.Attention, code non testé.
la source
\;
avant la-o
première ligne de lafind
commande, et vous ne devriez pas vous échapper!
dansif
- c'est juste!
, pas\!
Ce fil existe depuis des années et occupe toujours la première place sur Google. Je voulais donc ajouter une autre méthode. Comment je fais habituellement cela: en compressant le contenu du sous-répertoire dans une archive, en déplaçant l'archive vers le répertoire parent, puis en l'extrayant avec le comportement par défaut --overwrite. Cela fait exactement ce que vous recherchez. Ensuite, vous pouvez supprimer votre sous-répertoire.
la source
Si vous avez assez de stockage, vous pouvez le faire de la manière suivante:
Assurez-vous qu'il n'y a pas de fichiers importants avec un ~ à la fin, mais si c'est le cas, vous pouvez ajouter le fichier par
--suffix=whateveryouwant
défaut à la place.la source