Réponses:
Pas avec mv
.
La fonction principale de mv
(malgré son nom) est de renommer un objet. L'une des garanties offertes par UNIX est que les renommages sont atomiques - vous n'êtes jamais autorisé à voir un renommage partiellement terminé. Cette garantie peut être très utile si vous souhaitez modifier un fichier ( /etc/passwd
, par exemple) que d'autres programmes peuvent consulter, et que vous souhaitez qu'ils voient l'ancienne ou la nouvelle version du fichier, et aucune autre possibilité . Mais un "renommage récursif" comme vous le décrivez briserait cette garantie - vous pourriez l'arrêter au milieu et vous auriez un arbre à moitié déplacé et probablement un gâchis - et donc cela ne correspond pas vraiment à la philosophie de mv
. C'est ma supposition quant à pourquoi mv -r
n'existe pas.
(Peu importe que cela mv
rompt cette philosophie d'autres manières plus petites. Par exemple, mv
fait en fait un cp
suivi par rm
lors du déplacement de fichiers d'un système de fichiers à un autre.)
Assez de philosophie. Si vous souhaitez déplacer récursivement ("glisser-déposer") une arborescence d'un endroit à un autre sur le même système de fichiers , vous pouvez obtenir l'efficacité et la vitesse de la mv
manière suivante (par exemple):
cp -al source/* dest/ && rm -r source/*
L' -l
indicateur to cp
signifie "créer un lien dur au lieu de copier" - il crée effectivement un nouveau nom de fichier qui pointe vers les mêmes données de fichier que l'ancien nom de fichier. Cela ne fonctionne que sur les systèmes de fichiers qui prennent en charge les liens durs, donc tout système de fichiers natif UNIX est correct, mais cela ne fonctionnera pas avec FAT.
Le &&
moyen "n'exécute la commande suivante que si la commande précédente a réussi". Si vous le souhaitez, vous pouvez exécuter les deux commandes une par une à la place.
Je ne pense pas que vous puissiez reproduire le comportement de glisser-déposer que vous décrivez mv
, car les sous-répertoires non vides de la cible ne seront pas remplacés.
Peut rsync
- être ? Quelque chose comme ça rsync -a -r source/ target/
? Exécutez d'abord le -v -n
pour faire un essai à sec détaillé pour vous assurer qu'il fait ce que vous voulez.
Vous allez probablement vouloir changer la bonne réponse à ceci:
https://github.com/iaindooley/pickdrop
Exemple:
dis que j'ai:
test/
test/index.php
test/images/
test/images/a.jpg
test/images/thing.png
et je veux déplacer ces choses vers / site
il ressemble donc à:
site/
site/public/
site/public/index.php
site/public/a.jpg
site/public/thing.png
Je peux y aller:
cd images &&
pick a.jpg thing.png
cd .. &&
pick index.php &&
cd .. &&
mkdir site &&
mkdir site/public &&
cd site/public &&
drop
C'est littéralement couper et coller.