Warum verschiebt `mv file / dir` die Datei nicht in ein Unterverzeichnis des aktuellen Arbeitsverzeichnisses?

10

Ich war in meinem /etcVerzeichnis und habe den Befehl eingegeben

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

Ich dachte, das würde die Datei in das Verzeichnis verschieben, openvpndas ein Unterverzeichnis des /etcVerzeichnisses ist. Dies scheint jedoch nicht der Fall zu sein. Ich kann nur bestätigen, dass der Befehl ausgeführt wurde.

Whitelightning
quelle

Antworten:

51

Sofern kein Verzeichnis mit diesem Namen vorhanden ist, haben Sie die Datei openvpnin Ihr Stammverzeichnis umbenannt /. Führen Sie Folgendes aus, um dies rückgängig zu machen:

sudo mv /openvpn /etc/MyFile.conf

Wenn das Verzeichnis vorhanden war, in das Sie die Datei verschoben haben, lautet die Umkehrung:

sudo mv /openvpn/MyFile.conf /etc/

Um es in ein vorhandenes Unterverzeichnis des aktuellen Verzeichnisses zu verschieben, können Sie eines davon ausführen - diese verwenden relative Pfade:

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

.ist ein Link zum aktuellen Verzeichnis, bedeutet also ./am Anfang eines Pfades "in diesem Verzeichnis". Der Schrägstrich am Ende bedeutet, dass openvpnes sich um ein Verzeichnis handelt und Sie die Datei darin verschieben möchten. Wenn Sie es nicht weiter , wird die Datei verschoben hinein , wenn ein Verzeichnis mit diesem Namen existiert, sonst die Datei wird umbenannt zu openvpn. Mit einem /am Ende mvwerden Sie gewarnt, wenn das Verzeichnis fehlt und nicht umbenannt wird. Dies ist also der sichere Weg, wenn Sie nicht umbenennen möchten.

Wenn Ihr Pfad /andererseits mit einem absoluten Pfad beginnt, unabhängig vom aktuellen Arbeitsverzeichnis, ist er immer relativ zum Stammverzeichnis /. Wenn Sie absolute Pfade für Datei und Ziel verwenden, sieht Ihr Befehl folgendermaßen aus:

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

Weiterführende Literatur

Dessert
quelle
2
Wenn Sie nicht wissen, ob das Verzeichnis vorhanden ist, versuchen Sie zuerst den sudo mv /openvpn/MyFile.conf /etc/Befehl. In dem wahrscheinlichen Szenario, in dem das Verzeichnis nicht vorhanden war, wird nur ein Fehler angezeigt (wahrscheinlich "Kein Verzeichnis") und das Dateisystem nicht berührt. Dann können Sie einfach tun sudo mv /openvpn /etc/MyFile.conf.
Flarn2006
9

Sie müssen verwenden

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

um die MyFile.confDatei in das openvpnUnterverzeichnis von zu verschieben /etc/.

Auf der anderen Seite

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

würde die Datei stattdessen in das /Verzeichnis verschieben openvpn(dh umbenennen in openvpn) (vorausgesetzt, das /openvpnVerzeichnis existiert nicht).

pomsky
quelle
3
Der Schrägstrich am Ende des ersten Befehls ist optional. Aber ich denke, es ist eine gute Angewohnheit, sich darauf einzulassen, da der Befehl fehlschlägt, wenn es sich nicht um ein Verzeichnis handelt, anstatt eine verwirrende Situation wie die beschriebene OP zu erstellen (oder schlimmer noch, eine wichtige Datei zu überschreiben)
flarn2006
4

Wenn Sie eine Datei verschieben, teilen Sie dem Betriebssystem das Verzeichnis mit, in das Sie sie einfügen möchten, oder den neuen Pfad, den Sie angeben möchten.

Sie haben dem Betriebssystem "/ openvpn" mitgeteilt. Also wird es genau das tun - prüfen Sie, ob / openvpn existiert (dh ein Objekt namens "openvpn" im Stammverzeichnis) und ein Verzeichnis ist, und verschieben Sie in diesem Fall Ihre Datei in das Verzeichnis, oder ob / openvpn eine Datei ist oder existiert nicht, benenne deine Datei um und verschiebe sie, so dass sie jetzt als / openvpn zugänglich ist.

Sie wollten, dass es in ein Verzeichnis "openvpn" verschoben wird, das sich in Ihrem aktuellen Verzeichnis befindet , nicht in einem Verzeichnis , das sich im Stammverzeichnis des Dateisystems befindet (was das führende "/" bedeutet). Sie mussten also im Befehl move auf dieses Verzeichnis zeigen, nicht auf den absoluten Pfad "/ openvpn". Alle diese Funktionen funktionieren:

  • mv MyFile.conf openvpn - suche in meinem aktuellen Verzeichnis nach diesem "openvpn"
  • mv MyFile.conf /etc/openvpn - Suchen Sie nach dem absoluten Pfad / etc / openvpn
  • mv MyFile.conf openvpn/ - Suchen Sie in meinem aktuellen Verzeichnis nach einem Verzeichnis namens openvpn
  • mv MyFile.conf ./openvpn - macht das "aktuelle Verzeichnis" noch deutlicher

Kurzversion - Sie haben wahrscheinlich "/" verwendet, um "mein aktuelles Verzeichnis" zu bedeuten, daher bedeutet "/ openvpn" "openvpn, das sich in meinem aktuellen Verzeichnis befindet". Ein führendes "/" bedeutet jedoch immer nur "das Stammverzeichnis", daher bedeutete "/ openvpn" "openvpn im Stammverzeichnis". Was Sie brauchten, war einfach "openvpn" oder "openvpn /" zu verwenden, was "openvpn in meinem aktuellen Verzeichnis " bedeutet.

Stilez
quelle
1
Ich bin mir nicht sicher, warum diese Antwort abgelehnt wurde. es ist richtig und ich denke tatsächlich, es ist das klarste!
Leichtigkeit Rennen mit Monica
1

Jeder Pfad, der mit beginnt, /ist ein absoluter Pfad, nicht relativ.

Wenn alle Pfade immer relativ zum aktuellen Verzeichnis wären, wie würden Sie sich überhaupt cd /etcverhalten? Sie müssten cd ../../../../../etcund hoffen, dass das genug Level ist .., oder machen cd ..Sie einfach weiter, bis Sie zum Stammverzeichnis gelangen.

Oder Sie benötigen eine andere Syntax, um absolute Pfade auszudrücken. Unix entschied sich jedoch für /absolut, alles andere war relativ zum aktuellen Arbeitsverzeichnis des Prozesses. So mv MyFile.txt openvpnfunktionieren würde.


Und nein, es würde nicht gut funktionieren, aus vorhandenen oder nicht vorhandenen Dateien absolut oder relativ zu schließen. Wir möchten nicht , dass mkdirSystemaufrufe zu behandeln Pfade anders chdiroder renameSystemaufrufe, und macht das mvProgramm tut es bleibt nur Raum für Widerspruch zwischen mvund einem anderen Programm , das eine Ausgabedatei nimmt.

mvist bereits etwas Besonderes, da das rename()Ziel, wenn es sich um ein Verzeichnis handelt, den Quelldateinamen an dieses Zielverzeichnis anhängt und es erneut versucht. Beachten Sie jedoch, dass eine einfache Implementierungsstrategie darauf beruht, dass der erste rename()Systemaufruf mit EEXISToder fehlschlägt EISDIR. Wir müssen also wissen, ob ein Pfad relativ oder absolut ist, bevor wir das Dateisystem überprüfen.

(Early Unix lief auf langsamen Computern, auf denen zusätzliche Überprüfungen, ob ein Verzeichnis vorhanden war, zusätzliche E / A bedeuten könnten, wenn es nicht zwischengespeichert wurde, oder mehr Druck auf das Verzeichnis-Caching. Ich denke jedoch, dass Argumente für Vernunft / Korrektheit ausreichen, um zu erklären, warum Sie zuerst raten war keine plausible Funktionsweise des Systems, ohne auf historische Effizienzargumente zurückzugreifen.)

Peter Cordes
quelle
1

So vervollständigen Sie die anderen Antworten:

mv file.txt /location

ist das gleiche wie für Windows

mv file.txt c:\location

Das Dateisystem unter Linux entspricht dem Dateisystem-Hierarchiestandard , kurz FHS . Es hilft Ihnen zu wissen, wo eine Datei je nach Art und Inhalt abgelegt werden soll.

Der erste Ordner (entspricht c:Windows) ist /.

Pierre-Antoine Guillaume
quelle