Pourquoi `mv file / dir` ne déplace-t-il pas le fichier dans un sous-répertoire du répertoire de travail actuel?

10

J'étais dans mon /etcrépertoire et j'ai tapé la commande

me@mylaptop:/etc$ sudo mv MyFile.conf /openvpn

J'ai pensé que cela déplacerait le fichier dans le répertoire openvpnqui est un sous-répertoire du /etcrépertoire. Cependant, cela ne semble pas être le cas. Tout ce que je peux confirmer, c'est que la commande a été exécutée.

éclair blanc
la source

Réponses:

51

Si un répertoire portant ce nom n'existe pas, vous avez renommé le fichier openvpnsitué dans votre répertoire racine /. Pour annuler cela, exécutez:

sudo mv /openvpn /etc/MyFile.conf

Si le répertoire existait, vous avez déplacé le fichier à l'intérieur, alors la réversion est:

sudo mv /openvpn/MyFile.conf /etc/

Pour le déplacer vers un sous-répertoire existant du répertoire actuel, vous pouvez exécuter n'importe lequel d'entre eux - ceux-ci utilisent des chemins relatifs :

mv MyFile.conf openvpn
mv MyFile.conf openvpn/
mv MyFile.conf ./openvpn
mv MyFile.conf ./openvpn/

.est un lien vers le répertoire courant, donc ./au début d'un chemin signifie "dans ce répertoire". La barre oblique à la fin signifie qu'il openvpns'agit d'un répertoire et que vous souhaitez déplacer le fichier à l'intérieur. Si vous ne le fichier sera fournir, pas déplacé en si existe un répertoire avec ce nom, sinon le fichier sera renommé à openvpn. Avec un /à la fin, mvvous avertira si le répertoire est manquant et ne pas renommer, c'est donc le moyen sécurisé si vous ne voulez pas renommer.

Si votre chemin commence par /d'autre part, c'est un chemin absolu quel que soit le répertoire de travail actuel, il est toujours relatif au répertoire racine /. En utilisant des chemins absolus pour le fichier et la destination, votre commande ressemblerait à ceci:

mv /etc/MyFile.conf /etc/openvpn
mv /etc/MyFile.conf /etc/openvpn/

Lectures complémentaires

dessert
la source
2
Si vous ne savez pas si le répertoire existait ou non, essayez d'abord la sudo mv /openvpn/MyFile.conf /etc/commande. Dans le scénario probable, le répertoire n'existait pas, il vous donnerait simplement une erreur (probablement "Pas un répertoire") et ne toucherait pas le système de fichiers. Ensuite, vous pouvez simplement faire sudo mv /openvpn /etc/MyFile.conf.
flarn2006
9

Vous devez utiliser

me@mylaptop:/etc$ sudo mv MyFile.conf openvpn/

pour déplacer le MyFile.conffichier dans le openvpnsous-répertoire de /etc/.

D'autre part

me@mylaptop:/etc$ sudo mv MyFile.conf /openvpn

déplacerait le fichier vers le /répertoire as openvpn(c.-à-d. renommer as openvpn) à la place (en supposant que le /openvpnrépertoire n'existe pas).

pomsky
la source
3
De plus, la barre oblique à la fin de la première commande est facultative. Mais je suppose que c'est une bonne habitude à prendre, car cela fera échouer la commande si ce n'est pas un répertoire, plutôt que de créer une situation confuse comme OP décrit (ou pire, écraser un fichier important.)
flarn2006
4

Lorsque vous déplacez un fichier, vous indiquez au système d'exploitation le répertoire dans lequel vous souhaitez le placer ou le nouveau chemin que vous souhaitez lui attribuer.

Vous avez dit à l'OS "/ openvpn". Donc, cela va faire exactement cela - vérifiez si / openvpn existe (signifiant un objet appelé "openvpn" situé dans le répertoire racine) et est un répertoire, et si oui, déplacez votre fichier dedans, ou bien si / openvpn est un fichier ou n'existe pas, renommez et déplacez votre fichier pour qu'il soit désormais accessible sous / openvpn.

Ce que vous vouliez, c'était de le déplacer dans un répertoire "openvpn", qui se trouve dans votre répertoire actuel , pas celui qui se trouve dans le répertoire racine du système de fichiers (c'est ce que signifie le "/" principal). Il fallait donc pointer vers ce répertoire dans la commande de déplacement, pas vers le chemin absolu "/ openvpn". N'importe lequel de ces éléments fonctionnera:

  • mv MyFile.conf openvpn - recherchez dans mon répertoire actuel ce "openvpn"
  • mv MyFile.conf /etc/openvpn - recherchez le chemin absolu / etc / openvpn
  • mv MyFile.conf openvpn/ - recherchez dans mon répertoire actuel, un répertoire appelé openvpn
  • mv MyFile.conf ./openvpn - rend le "dir actuel" encore plus évident

Version courte - vous avez probablement utilisé "/" pour signifier "mon répertoire actuel", donc "/ openvpn" pour signifier "openvpn qui est dans mon répertoire actuel". Mais un "/" de tête ne signifie que "le répertoire racine", donc "/ openvpn" signifiait "openvpn dans le répertoire racine". Ce dont vous aviez besoin était simplement d'utiliser "openvpn" ou "openvpn /", ce qui signifie "openvpn dans mon répertoire actuel ".

Stilez
la source
1
Je ne sais pas pourquoi cette réponse a été rejetée; c'est correct et je pense que c'est le plus clair!
Courses de légèreté en orbite le
1

Tout chemin commençant par /est un chemin absolu et non relatif.

Si tous les chemins étaient toujours relatifs au répertoire courant, comment le feriez-vous cd /etcen premier lieu? Vous devriez cd ../../../../../etcet espérer que ce soit suffisamment de niveaux .., ou continuer à le faire cd ..jusqu'à ce que vous arriviez au répertoire racine.

Ou vous auriez besoin d'une autre syntaxe pour exprimer des chemins absolus. Mais Unix a décidé de /vouloir dire absolu, tout le reste étant relatif au répertoire de travail actuel du processus. Cela mv MyFile.txt openvpnfonctionnerait aussi.


Et non, cela ne fonctionnerait pas bien pour déduire une valeur absolue ou relative à partir de fichiers existants ou non. Nous ne voudrions pas que les mkdirappels système traitent les chemins chdirou les renameappels système différemment , et faire en sorte que le mvprogramme le fasse laisse simplement place à une incohérence entre mvet un autre programme qui prend un nom de fichier de sortie.

mvest déjà spécial car lorsque la rename()destination est un répertoire, il ajoute le nom du fichier source à ce répertoire de destination et réessaye. Mais notez qu'une stratégie d'implémentation simple repose sur l' rename()échec du premier appel système avec EEXISTou EISDIR. Nous devons donc savoir si un chemin est relatif ou absolu avant de vérifier le système de fichiers.

(Early Unix fonctionnait sur des ordinateurs lents, où des vérifications supplémentaires si un répertoire existait pouvaient signifier des E / S supplémentaires s'il n'était pas mis en cache, ou plus de pression sur la mise en cache du répertoire. n'était pas un moyen plausible pour le système de fonctionner, sans recourir à des arguments d'efficacité historiques.)

Peter Cordes
la source
1

Pour compléter les autres réponses:

mv file.txt /location

est le même que pour Windows

mv file.txt c:\location

Le système de fichiers sous Linux est pensé conformément à la norme de hiérarchie des systèmes de fichiers , ou FHS pour faire court. il vous aide à savoir où placer un fichier en fonction de sa nature et de son contenu.

Le premier dossier (équivalent à c:Windows) est /.

Pierre-Antoine Guillaume
la source