GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum kann mv nicht mit der Existenz eines gleichnamigen Verzeichnisses im Ziel umgehen?

mv und rsync sind keine ähnlichen Programme. Insbesondere mv versucht oft, Objekte einfach umzubenennen. Wenn es sich im selben Dateisystem befindet, kopiert es den Inhalt überhaupt nicht.

Falls Sie imperative_PLs/fortran noch nicht hatten , dann mv würde den vorhandenen fortran nehmen Verzeichnis und benennen Sie es an dieser Stelle im Baum um.

Aber Sie haben bereits ein Verzeichnis (mit Inhalt) an dieser Stelle. Da ein Name nur auf ein einzelnes Objekt verweisen kann, müsste das vorhandene Verzeichnis entweder entfernt oder umbenannt werden. mv geht davon aus, dass Sie beides nicht wollen und bricht ab.

rsync kopiert stattdessen die einzelnen Dateien und andere Inhalte in fortran und fügt sie in den bestehenden imperative_PLs/fortran ein Verzeichnis.

Betrachten Sie es als rename stattdessen, und das Verhalten könnte verständlicher erscheinen.


mv ist eigentlich rename unter der Decke.

Wenn Sie eine Datei in eine andere Datei verschieben, mv geht davon aus, dass Sie wissen, was Sie tun, und überschreibt die Zieldatei.

Wenn Sie ein Verzeichnis in ein anderes Verzeichnis verschieben, mv geht davon aus, dass Sie den Basisnamen Ihres ursprünglichen Verzeichnisses beibehalten und im Zielverzeichnis erstellen möchten. Wenn es auf der Zielseite noch kein Verzeichnis mit diesem Namen gibt oder wenn ein Verzeichnis mit diesem Namen existiert, aber leer ist, ist die Operation erfolgreich.

Wenn das Zielverzeichnis jedoch bereits existiert und nicht leer ist, ist dies kein rename mehr aber das sollte eine rekursive Datei- und Verzeichnisentfernung sein. rename ist nicht dafür ausgelegt, also schlägt es fehl, mv geht nicht weiter, da es davon ausgeht, dass Sie es nicht tun wollten, und schlägt ebenfalls fehl.


  1. mv funktioniert in diesem Fall nicht, weil es nicht dafür ausgelegt ist. Die Systemaufrufe sind (wahrscheinlich) entweder

    • In dasselbe Dateisystem verschieben:rename (ursprünglich link und unlink )
    • Über Dateisysteme verschieben:rekursive Dateikopie gefolgt von rekursivem unlink
  2. Meinung:Ich denke, es liegt nicht so sehr daran, dass es nicht entworfen wurde zu funktionieren, da es nicht für diesen Anwendungsfall entwickelt wurde. Für ein "einfaches" Tool, das eine Sache gut machen soll, müssten Sie eine Reihe von Schaltern bereitstellen, um mv anzuzeigen Welcher dieser Aktionspfade soll eingeschlagen werden:

    • Um mit einem Fehler abzubrechen, wie in der aktuellen Implementierung
    • Zum Zusammenführen, Abbrechen mit einem Fehler, wenn eine Datei bereits existiert
    • Zum Zusammenführen alle bereits vorhandenen Zieldateien ersetzen

Wenn Sie die Zusammenführungs-/Ersetzungsaktion wünschen, können Sie sie ganz einfach mit cp implementieren gefolgt von rm , oder indem Sie eines der Dienstprogramme zum Kopieren von Dateibäumen tar verwenden , pax usw.


Linux
  1. Warum kann Rm schreibgeschützte Dateien entfernen?

  2. Können Sie Anker ^ $ mit Ls verwenden?

  3. Warum kann ich Cd nicht in einem Bash-Skript verwenden?

  4. Warum kann ich mich mit Teilpasswörtern anmelden?

  5. Wie kann ich in ein anderes Zielverzeichnis zippen?

Warum ich bei xterm bleibe

Rsync-Befehl in Linux mit Beispielen

Linux-CD-Befehl mit Beispielen

Verwendung von –exclude mit dem Du-Befehl?

Warum ist es Rm -rf und nicht Rmdir -rf?

Warum kann ich mein System nicht mit einer Gabelbombe zum Absturz bringen?