'mv' équivalent de glisser-déposer avec replace?

19

Dans un environnement GUI, un glisser-déposer avec replace remplacera les fichiers et les répertoires entiers (y compris le contenu) par tout ce qui est copié. Existe-t-il un moyen d'obtenir ce même résultat intuitif avec la commande 'mv'?

user7089
la source

Réponses:

20

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 -rn'existe pas.

(Peu importe que cela mvrompt cette philosophie d'autres manières plus petites. Par exemple, mvfait en fait un cpsuivi par rmlors 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 mvmanière suivante (par exemple):

cp -al source/* dest/ && rm -r source/*

L' -lindicateur to cpsignifie "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.

Jander
la source
Extrêmement informatif. Merci beaucoup!
user7089
4

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 -npour faire un essai à sec détaillé pour vous assurer qu'il fait ce que vous voulez.

cjc
la source
3

mv -f /path/to/source/folder/* /destination/folder/

Déplace tout dans / chemin / vers / source / dossier, y compris les fichiers et répertoires vers / destination / dossier.

Et écrasera les fichiers et répertoires existants.

Tim
la source
2
Uniquement les répertoires vides
Kevin
1

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.

testeur
la source
Très cool, et mérite vraiment d'être examiné. Cependant, la question portait spécifiquement sur «mv», donc je pense que je vais laisser la bonne réponse comme celle qui explique la philosophie derrière mv en détail. Merci pour cette contribution, vraiment très utile.
user7089
À noter également dans le fichier lisez-moi: "Il n'est pas du tout robuste - il stocke vos choix dans ~ / .pick jusqu'à ce que vous appeliez drop auquel moment il utilise les chemins de fichier dans ~ / .pick pour créer un nouveau fichier exécutable ~ / .drop pour copier chacun des fichiers que vous avez choisis dans le répertoire de travail actuel. "
user7089